소개

 ssh 를 이용한 직접 root 로그인은 지양해야 합니다. 대신 관리 (aka root) 작업은 반드시 root 로 su 하거나 sudo 를 이용해야 합니다. 애플의 맥 OS X 은 루트 계정이 활성화 되지도 않습니다 - 모든 작업이 만드시 sudo 를 이용해서 이루어져아 합니다. 필자의 시스템들은 하나의 마스터 호스트를 이용해서 관리되며 이 호스트를 이용해서 동일한 OS 와 설정을 가진 다른 모든 시스템들을 업데이트 하는 다양한 스크립트들에 의존 합니다. 이것은 마스터 머신의 root ssh 권한이 클라이언트 머신에게도 필요하다는 것을 의미 합니다.

 다음의 기술팁은 클라이언트 머신상의 권한이 없는 어카운트 에서 sudo 를 이용해서 마스터 머신에 ssh 를 이용해서 rdistrsync 를 이용한 원격 업데이트를 가능하도록 합니다. 이 특수한 계정은 오직 두개의 sudo 커맨드를 실행하도록 허가 되었고 다른 어떠한 권한도 허락되지 않습니다. 마스터 머신은 root 를 위해 생성된 ssh 키를 가지고 있고 이 키는 각 머신의 권한이 없는 계정에 저장되어서 권한이 필요한 ssh 접근(패스워드 없는 ssh 접근) 을 가능하도록 합니다.

 이것은 마스터 루트 머신이 각 머신에 대한 ssh 접근을 권한이 없는 계정을 이용해서 할 수 있도록 합니다. sudo 는 이때 권한이 없는 계정이 rdist/rsync 컴퓨터를 root 의 권한으로 실행할 수 있도록 합니다. 이것은 마스터 머신의 파일 업데이트가 권한, 파일 생성/삭제 등이 root 의 권한으로 수행되어야 하기 때문입니다. 오직 마스터 머신의 root 계정이 원격 계정(권한이 없는) 에 접근 가능하고 오직 하나 혹은 두개의 sudo 권한만이 허락 됩니다.


설정

 권한이 없는 계정을 설정합니다. 필자의 설정에서는 remupd 를 사용했습니다. 참고: 필자는 계정이 bash 쉘을 이용하도록 설정했습니다. rdist 를 위해서는 작은 쉘 함수가 설정이 되어야 합니다. 만약 다른 쉘이 사용된다면 이것은 수정되어야 합니다.


1. /etc/passwd 항목

remupd:x:4761:60001:Remote Update Admin:/var/sys/remupd:/usr/bin/bash


2. /etc/shadow 항목

remupd:NP:::::::

 주의: 이것은 계정이 잠겼음을 나타내는 "*LK*" 가 나타나면 안됩니다. ssh 는 계정이 잠겼다면 접근을 허락하지 않습니다. 필자는 syslog 에서 다음과 같은 메세지를 확인하였습니다:

Nov  8 12:45:07 underscore sshd[1491]: [ID 800047 auth.info] User remupd not allowed because account is locked


3. sudoers

 다음의 설정을 통해서 remupd 가 몇가지의 커맨드를 root 권한으로 실행할 수 있도록 하였습니다.

# Cmnd alias specification
Cmnd_Alias   RSYNCDIST=/usr/local/bin/rsync, /usr/local/sbin/rdistd
...
remupd	ALL=NOPASSWD:RSYNCDIST

NOPASSWD 플래그는 remupd 가 인증 없이 sudo 를 실행하도록 허락 합니다.


4. 홈디렉토리의 .bashrc (예제에서는 /var/sys/remupd)

rdistd() (
 /usr/local/bin/sudo /usr/local/bin/rdistd -S
)

이것은 rdistd 의 인바운드 rdist 를 위한 쉘 함수를 설정 합니다. 만약 rdist 가 사용되지 않는다면 신경쓰지 않아도 됩니다.


5. .ssh/authorized_keys2


 서버의 root 계정에서 ssh 키를 생성하고 퍼블릭 키를 각 원격 머신에 e authorized_keys2 파일로 저장합니다.

ssh-keygen -d -N ""

이제 .ssh/id_dsa.pub 을 원격의 ~remupd/.ssh/authorized_keys2 파일로 복사 합니다.


테스트

마스터 머신의 루트로 실행합니다

ssh -l remupd remote_host who

만약 설정이 올바로 되었다면 이 커맨드는 패스워드를 묻지 않고 바로 실행될 것입니다.


rsync

 다음의 커맨드는 rsync 를 수동으로 실행하고 어떠한 파일도 수정하지 않습니다. 이 명령은 마스터와 원격 노드간에 어떠한 파일이 수정되어야 하는지에 대한 목록을 보여 줍니다.

    rsync -avHDn --delete --rsh="ssh -l remupd -x -c blowfish" \
        --rsync-path="/usr/local/bin/sudo /usr/local/bin/rsync" \
        /usr/ dixieland:/usr

 이 커맨드는 rsync 체크를 실행 하지만 실제로 어떠한 것도 수정하지는 않습니다. sudo 와 rsync 의 경로를 적절하게 수정해 주시기 바랍니다. 이것은 비-root 로의 ssh 접속을 허용 하는데 이것은 PermitRoot 설정이 활성화되지 않아도 된다는 것을 의미 합니다. 서버의 root ssh 키는 인증된 접근이 비-루트 remupd 계정을 위해 설정되었습니다. remupd 계정의 sudo rsync 가 원격의 root rsync 를 실행할 수 있도록 설정함으로써 rsync 간의 링크가 root 에 의해 실행되어 올바른 작업을 할 수 있도록 합니다.


rdist

 rdist 를 테스트 하기 위해서 작은 스크립트를 만들고 업데이트 부분에 remupd@remote 를 기술해서 원격에서 rdistd 를 실행할 유저를 지정 합니다 ( rdist 의 클라이언트 부분).

rdist -v -P rdsh -f r-s10-root

스크립트 부분

${UPDATE_LIST} -> ( remupd@${HOSTS} )
       install -oremove,chknfs ;
       except ${EXCEPTS} ;

 지금까지의 작업을 통해서 원격머신의 비-루트 계정 remupd 이 sudo rdistd 를 root 권한으로 시작시킴으로써 (위의 .bashrc 파일에서 지정된 대로) rdist 서버에서 받아온 파일들이 적절하게 업데이트 될 수 있도록 합니다. 그러므로 서버와 원격서버 간의 통신은 루트 ssh 를 통한 원격 서버로의 접근을 필요로 하지 않고 그들의 연결 링크 만이 루트 권한으로 sudo 를 이용해 실행 됩니다.

필자가 사용한 표준 rdist 래퍼 스크립트는 다음과 같습니다.


rdsh 래퍼 스크립트

#!/bin/sh
# rdist shell wrapper
# basically calls ssh with additional ssh options
#
if [ -x /usr/local/bin/ssh ]; then
       exec /usr/local/bin/ssh -x -q -o "BatchMode yes" -c blowfish $* 2>/dev/null
else
       echo "can't execute /usr/local/bin/ssh"
       exit 1
fi


로깅

syslog (보통 auth 설비) 에서 다음의 로그 메시지 예가 실행될때 마다 기록되어야 합니다:

Nov 14 00:03:07 sabrina sshd[6595]: Accepted publickey for remupd from 169.232.144.42 port 59746 ssh2
Nov 14 00:03:07 sabrina /usr/local/bin/sudo: remupd : TTY=unknown ; PWD=/var/sys/remupd ;
     USER=root ; COMMAND=/usr/local/bin/rdistd -S

rsync 의 로그 메세지는 다음과 같을 것입니다:

Nov 14 00:05:45 sabrina sshd[6599]: Accepted publickey for remupd from 169.232.144.42 port 3407 ssh2
Nov 14 00:05:45 sabrina /usr/local/bin/sudo: remupd : TTY=unknown ; PWD=/var/sys/remupd;
     USER=root ; COMMAND=/usr/local/bin/rsync --server -vlHogDtpr --delete . /usr


요약

 rsync/rdist 를 ssh 를 통해 마스터 머신에서 파일 업데이트를 위해 사용 하는것 (/usr, /opt 같은) 은 다수의 머신을 중앙집중식으로 관리하는 하나의 방법입니다. 그러나 이러한 작업은 원격의 root 권한 접근이 필요하고 추가적인 보안 설정이 필요합니다. PermitRoot sshd 설정은 반드시 ssh 를 이용한 root 접근을 막기 위해 비활성화 되어야 합니다. 인증된 ssh 접근을 원격머신의 sudo 와 연결 시킴으로써 마스터와 완격 노트간 통신 링크를 설정할 수 있고 그러므로 rsync/rdist 가 잘 동작합니다.


이 글의 영문 원본은
http://wikis.sun.com/display/bigadmin/u ··· updating
에서 보실 수 있습니다.

"관리자코너" 카테고리의 다른 글

2008/03/11 13:38 2008/03/11 13:38

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/524

댓글을 달아 주세요

[로그인][오픈아이디란?]

◀ Prev 1  ... 144 145 146 147 148 149 150 151 152  ... 641  Next ▶