다음 이전 차례

3. 텔넷 서비스(Telnet)

유닉스 계열 고유의 멋진 기능이라고 할 수 있다. 원격 호스트로부터 서버로의 접속을 허락하고 여러분 서버의 시스템 자원을 사용할 수 있도록 허용해주는 것이다. telnet <호스트명 또는 호스트 IP 주소> 를 입력하고 들어감으로써 접속한 사람이 마치 그 서버 콘솔 앞에 앉아 있는 것처럼 서버의 프로그램을 사용할 수 있다.

클라이언트/서버 모델을 모르고서는 네트워크를 사용한다는 것이 불가능하다고 말하고 싶다. 하지만 이 이슈는 클라이언트 사용자에게 필요한 내용이다. 사용자는 서버의 자원을 사용하고 있으며 그 결과만을 자신의 터미널로 출력 받는다는 사실을 잘 알고 있어야 한다.

3.1 사전 준비

텔넷 등의 데몬에 약간의 버그가 있다고 알려져 있다. 꼭 엄청난 버그, 보안에 관계된 버그는 아니더라도 네트워크 데몬에 대해서는 정기적으로 최신 버전으로 교체할 필요성이 있다. 그것 말고 네트워크 관리자가 할 일이 또 무엇이겠는가? 여러분이 받아와야 할 파일은 netkit-base-0.10.tar.gz라는 파일이다(물론 이보다 상위 버전이 있다면 그것을 받아오라). 주 사이트는 ftp.uk.linux.org이며 부 사이트는 유명한 sunsite.unc.edu이다. 물론 국내에도 미러 사이트가 있다. 파일을 받을 때는 꼭 .tar.gz대신 .txt 또는 .lsm ( Linux Software Map )이라는 이름으로 끝나는 파일을 받아서 확인해보기 바란다. 자료를 풀고 그냥 make하는 것만으로도 원하는 파일을 컴파일할 수 있도록 되어 있다. 필자는 알짜 슬랙웨어 3.1과 libc 5.4.7에서 에러 하나 없이 무사히 컴파일 하였다. 설치는 루트 권한으로 make install이다. 텔넷 말고도 여러 가지 네트워크 데몬들을 설치해준다. biff, comsat, finger, fingerd, inetd, ping, rlogin, rlogind, rpc, rpcgen, rpc.usersd, rpc.rwalld, rpcinfo, rsh, rshd, rusers, rwall, rwho, rwhod, bsdslattach, talk, talkd, timed 등이 바로 그것이다. 뒤에 d로 끝나는 파일은 모두 데몬을 뜻한다.

3.2 사용자 계정 만들기

일단 사용자의 요청을 받아서 서버의 하드디스크에 계정을 만들어야 한다. 보통 많은 배포판에서는 adduser와 같은 스크립트 또는 실행파일(스크립트는 해킹하기 쉬우므로 아예 실행파일로 만드는 것도 좋은 방법이다)을 제공해서 사용자를 등록할 수 있도록 해주고 있다. 사용법은 다음과 같다.

# adduser

Adding a new user. The username should not exceed 8 characters
in length, or you may run into problems later.

사용자 ID를 만들 때는 8자 이상 넣지 말라. 그것을 염두에 두기 바란다.

Enter login name for new account (^C to quit): foo

Editing information for new user [foo]

사용자에 관한 정보를 넣는다. 사용자의 본명, GID, UID, 홈 디렉토리, 사용하는 셸의 종류, 패스워드 등 아주 중요한 정보를 입력해야 한다. 특히 UID는 모든 사용자에게 유일한 수치여야 하므로 각별히 주의하기 바란다.

Full Name: Lee Man Yong
GID [100]: ?
여기서 그냥 엔터, 사용자 그룹을 만들어주길 원한다면 잠시 뒤의 설명을 보라.
Group 'users', GID 100
First unused uid is 506

adduser 스크립트가 자동으로 사용되지 않은 UID 중 가장 낮은 번호를 여러분에게 제공해준다. 그 값을 그냥 사용하면 된다. 여러분이 특별하게 해줄 필요가 있다면 원하는 수치를 적어준다. 하지만 절대 중복된 수치가 들어가서는 안된다는 것을 명심하라.

UID [506]: ?

Home Directory [/home/foo]: ?
홈 디렉토리는 보통 /home 아래에 생긴다. 하 지만 정말로 대형 서버인 경우에는 사용자들을 여러 그룹으로 나누어 /home1, /home2, /home3 이런 식으로 디렉토리를 많이 나누고 그 아래에 적절하게 배분해주기도 한다. 예를 들어 학교에서 학번 별로 관리를 하려고 한다면 /90, /91, /92 처럼 해주고 사용자의 학번을 알아서 관리하는 것이 좋지 않을까? 작은 시스템에서는 그냥 /home 하나 아래에다가 관리하는 것이 좋다.

Shell [/bin/bash]: ?
또는 C 셸을 선호하는 사람은 /bin/tcsh라고 입력해준다.

Password [foo]:Shell [/bin/bash]: ********?

패스워드를 제외하고는 대부분의 설정은 <엔터>키만으로도 해결된다. 패스워드는 영어사전에 있는 단어를 사용하지 말고 대소문자, 숫자를 섞어서 사용하는 것이 좋다. 학교 랜 환경에서 믿을 수 있는 사람들끼리 사용하는 느슨한 시스템이라면 별 상관없다. 나중에 세팅을 통해서 여러분의 랜에 물린 믿을 수 있는 컴퓨터들 빼고는 다른 곳에서 텔넷 접속을 할 수 없도록 만들 수 있으니까 그때 가서 알아보도록 하자.

Information for new user [foo]:
Home directory: [/home/foo] Shell: [/bin/bash]
uid: [506] gid: [100]

여러분이 입력한 최종 정보를 보여주며 사용자를 등록할 것인지 물어온다.

Is this correct? [y/N]: Y

Adding login [foo] and making directory [/home/foo]

Adding the files from the /etc/skel directory:
./.less -> /home/foo/./.less
./.lessrc -> /home/foo/./.lessrc
./.Xdefaults -> /home/foo/./.Xdefaults
./.Xmodmap -> /home/foo/./.Xmodmap
./.bash_logout -> /home/foo/./.bash_logout
./.bash_profile -> /home/foo/./.bash_profile
./.bashrc -> /home/foo/./.bashrc
./.emacs -> /home/foo/./.emacs
./.inputrc -> /home/foo/./.inputrc
./.kermrc -> /home/foo/./.kermrc
./.mailcap -> /home/foo/./.mailcap
./.mime.types -> /home/foo/./.mime.types
./.cshrc -> /home/foo/./.cshrc

스크립트는 마지막으로 사용자 홈디렉토리를 만들고 기본적인 세팅을 담고 있는 파일들을 자동으로 /etc/skel 디렉토리에서 사용자 홈디렉토리로 복사한다. .bashrc, .inputrc, .cshrc 등 중요한 파일을 꼭 /etc/skel에 넣어두고 사용자들이 처음부터 중요하지 않은 세팅에 시간을 쏟지 않아도 되도록 신경을 쓰면 좋다. 관리자 한 명의 위력은 대단하다. 그 사람이 한 시간만 봉사하면 나머지 사람들은 한 시간씩이 모두 절약된다.

3.3 사용자 계정을 만들고 난 후의 점검 사항

첫 번째, 퍼미션! 퍼미션! 퍼미션! 사용자의 홈 디렉토리는 보통 drwxr-xr-x라는 퍼미션을 가지고 있다. 앞의 d 는 디렉토리라는 의미일 뿐이고 나머지 rwx, r-x, r-x가 각각 사용자, 그룹, 타인에 대한 퍼미션이라는 것을 알 것이다. 보안이 중요하게 느껴지는 환경에서는 타인에 대하여 x 퍼미션을 없애면 아예 디렉토리로 들어올 수 없으니 사용자들에게 맡기기보다는 스크립트 같은 것을 하나 만들어서 모든 사용자들의 홈 디렉토리에서 타인의 실행 퍼미션을 제거해주는 것도 좋다. 사실 관리자가 해야 할 대부분의 일은 퍼미션이다. 이거 하나만 잘 관리하면 제일 안전한 서버가 된다. 여러분의 서버에 들어와서 장난을 하고 싶어하는 크랙커가 있다 하더라도 철통같은 퍼미션에 금방 싫증을 느낄 것이다. 그 크랙커는 다시는 여러분의 서버로 들어오지 않는다. 왜냐하면 좀처럼 쉽게 크랙이 되질 않아 자기 스스로 지치기 때문이다. 아마도 다른 곳을 찾아 떠날 것이다. 두 번째 root만이 사용하는 실행파일의 퍼미션을 철저히 하라. 특히 /sbin, /usr/sbin 디렉토리는 타인에 대한 실행퍼미션(디렉토리에 대한 실행 퍼미션은 특수한 의미를 갖는다)을 없애서 들어갈 수조차 없도록 하라. /sbin 과 /usr/sbin 디렉토리에 있는 대부분의 프로그램들은 root가 아닌 사람이 사용할 필요가 전혀 없다. 특히 fdisk같은 것은 절대 타인의 실행 퍼미션이 있어선 안된다. 세 번째 쓸모없는 프로그램은 지운다. 예를 들어 사용자를 변경하여 사용할 수 있게 해주는 su는 아주 위험한 명령임에 틀림없다. su가 있다면 일반사용자로 들어와서도 루트의 패스워드만 알아내면 언제든지 루트로 돌변할 수 있기 때문이다. su와 sudo에 대해서는 잘 생각해보기 바란다.

3.4 쿼터 제한 가하기

쿼터(quota) 제한이란 사용자가 이용할 수 있는 하드디스크의 양을 제한하는 것을 말한다. 커널 컴파일할 때 쿼터 제한 기능을 꼭 집어넣어서 컴파일하고 쿼터 제한을 가할 수 있게 해주는 프로그램들(quota, edquota, quotacheck, quotaon, repquota, quotactl)을 이용하면 된다. 쿼터 제한을 하는 이유는 절대로 사용자들에게 제한을 가하려는 것이 아니다. 다중 사용자 환경에서 한 사람의 사용자가 자원을 독차지함으로써 다른 사용자에게 피해를 주는 일을 없애기 위해서이다. 악의적인 사용자가 인터네트로부터 윈도95용 오락을 잔뜩 ftp로 받아놓고 /home 파티션을 다 차지해 버리면 어떻게 할 것인가? 쿼터 제한만이 있다면 사용자들은 불평을 할 것이다. 그래서 쿼터 제한과 함께 있어야 할 것은 모든 사람이 자유롭게 사용할 수 있는 하드디스크 공간이다. 홈 디렉토리에서는 쿼터를 걸지만 그 자유공간만은 사용자들의 자율에 맡기는 것이다. 보통 여분의 하드디스크가 있으면 /var/tmp 등의 디렉토리에 마운트시 켜놓고 퍼미션을 자유롭게 해준다.

3.5 파티션 원칙

/home 파티션, /var/tmp 등의 파티션은 루트 파티션이나 기타 /usr 파티션과 구분하여 사용하는 것이 좋다. 파티션을 따로 분할해서 마운트하여 사용하든가 아니면 여분의 하드디스크가 많을 때는 아예 다른 하드디스크에 두면 좋다. 특히 /usr 파티션은 읽기 전용으로만 마운트되는 것이 제일 바람직하다. 자세한 사항은 리눅스 파일 시스템 규격인 FSSTND 문서를 구해서 읽어보기 바란다.

3.6 사용자 지우기

사용자를 지워야 할 때도 있을 것이다. 하지만 여러분이 기대하는 deluser와 같은 것은 없다. 하지만 지우는 방법은 아주 간단하다. /etc/passwd에서 사용자에 해당하는 줄을 지우고 그 사용자의 홈 디렉토리를 모두 지워주면 된다. 하지만 그 사용자의 파일이 홈 디렉토리 뿐만 아니라 다른 곳에 산재해 있을 수도 있다. 그럴 때는 다음과 같이 하면 된다.

find / \( -nogroup -o -nouser \) -print

이렇게 하면 사용자를 지우기 때문에 생긴 고아 파일들이 나열된다. 그런데 이런 방법은 상당히 조심해야 한다. 뜻하지 않는 파일을 지울 수도 있기 때문이다. 또는 미리 find / -user foo로 파일들을 검색해서 수동으로 지우자. 보통

find / -user foo -exec rm -f {} \;

하면 될 것으로 생각하는 사람이 많은데 이것은 여러분 시스템의 퍼미션이 완벽한 경우에나 제대로 되지 행여나 조금이라도 잘 못하는 경우에는 원하지 않는 파일을 지우는 수가 있다. 관리자, 그리고 관리자의 개인 아이디인 경우만 조심하면 된다. 나머지 일반 사용자에 대해서는

find / -user <사용자명> -exec rm -f {} \;

만 해도 될 것이다. 어찌되었든 여러분이 관리자라면 정말로 흥미로운 find 명령을 잘 익혀두길 바란다. 관리자가 find라는 명령을 모른다면 이미 실격이다.

3.7 패스워드 파일에 익숙해지기

/etc/passwd 파일을 한 번 살펴보기 바란다.

ftp:*:404:1::/home/ftp:/bin/bash
guest:*:405:100:guest:/dev/null:/dev/null
yong:JprJGlXBC1bGQ:501:100:Lee Man Yong,Home,,(02) 603-2461,:/home/yong:/bin/bash
smileguy:EbhqvUES5/4/s:502:100:J J H:/home/smileguy:/bin/bash
postgres:PbKIAttHJZqJw:503:100:Postgres95 Master:/home/postgres95:/bin/csh

형식은 다음과 같다.

사용자명:암호화된 패스워드:UID:GID:사용자정보:홈 디렉토리:사용셸

7개의 필드가 콜론(:)으로 분리되어 있다. adduser라는 스크립트를 쓰지 않고 그냥 수동으로 입력해도 된다. ftp, guest라는 사용자를 한 번 살펴보자. ftp라는 사용자는 익명 FTP 사용자를 말하는데 패스워드 필드에 애스터리스크 문자(*)가 있는 것을 주목하자. 이렇게 하면 그 사람은 등록되어 있기는 하지만 로그인 할 수가 없게 된다. 잠시 어떤 사람을 로그인하지 못하게 만들려면 패스워드 맨 앞에 애스터리스크 문자(*)를 넣어주면 된다. 그것을 해제하면 다시 로그인할 수 있다.

3.8 그룹 만들기

그룹으로 관리할 필요성에 대하여 위에서 얘기한 바 있다. 그것은 그렇게 어렵지 않다. /etc/group 이라는 파일을 한 번 살펴보도록 하자. 형식은 /etc/passwd 파일과 비슷하다. ''그룹명:패스워드:GID:그룹회원명 리스트'' 라는 간단한 형식을 갖는다. 보다시피 패스워드 필드는 모두 아무 것도 넣지 않았다. 그룹에 패스워드를 부여하려는 경우를 빼고는 대부분 사용자 패스워드 만으로도 충분한 것 같다. 새로운 그룹을 만들려면 위에 있는 그룹 중 다른 이름 그리고 유일한 GID를 부여한다. 그리고 원하는 사용자를 회원 리스트에 콤마(,)로 분리하여 넣으면 된다.

root::0:root
bin::1:root,bin,daemon
daemon::2:root,bin,daemon
sys::3:root,bin,adm
adm::4:root,adm,daemon
tty::5:
disk::6:root,adm
lp::7:lp
mem::8:
kmem::9:
wheel::10:root
floppy::11:root
mail::12:mail
news::13:news
uucp::14:uucp
man::15:man
users::100:games
nogroup::-2:

3.9 셰도 패스워드 시스템

상당한 보안이 필요한 시스템의 경우에는 셰도 패스워드라는 것을 사용한다. /etc/passwd 파일은 루트 사용자만이 아닌 모든 사람들이 읽을 수 있는 파일이므로 원하는 사람은 누구나 카피본을 가질 수 있고 일명 '사전 공격 (Dictionary Attack)’이라는 방식을 써서 간단한 패스워드를 쓴 사용자들의 암호를 깰 수 있기 때문이다. 그래서 진짜 패스워드는 다른 곳에 숨겨두고 쓸모없는 /etc/passwd를 보여주는 셰도(Shadow) 패스워드 시스템이라는 것이 나온 것이다. 셰도 패스워드를 다루지는 못하겠다. 왜냐하면 상당히 번거롭기 때문이다. 사실 셰도 패스워드 시스템으로 전환하려면 상당한 노력이 든다. 단지 패스워드 스템만 바꾸는 것이 아니라 그에 연관된 모든 프로그램들을 셰도 패스워드용으로 구해야 한다는 수고가 든다. 관련 How-To 문서가 있으니 관심 있는 사람들은 그것을 참고하기 바란다.

3.10 X 윈도 프로그램 사용하게 만들기

텔넷으로 할 수 있는 재미있는 일 중 하나가 바로 X 클라이언트/X 서버의 연결이다. 만약 여러분의 서버에 X 윈도를 작동시켰다면 그리고 적절한 세팅을 해주면 X 윈도 사용자들은 여러분의 X 윈도 프로그램을 가동시켜서 자신의 로컬 X 윈도에서 그 결과를 사용할 수 있다. 이렇게 함으로써 대형 서버만이 특정 대형 프로그램들을 구비하고 있어도 접속만 하면 마치 자기 컴퓨터의 프로그램을 쓰듯 사용할 수 있다. 물론 충분한 네트워크 속도가 나와야 한다. 일반적으로 X 서버가 작동하면 다른 호스트에서 들어와서 서버의 X 프로그램을 사용하여 자신의 X 터미널에서 결과를 볼 수 있게 되어있지 않다. 그래서 서버에서는 다음과 같은 일을 해주어야 한다.

xhost +호스트명
또는
xhost +

설정한 호스트명으로부터 X 연결을 허용한다. 플러스(+) 문자 대신 마이너스 (-) 문자를 사용하면 주어진 호스트로부터 X 연결을 불허한다. 그냥 플러스 자만 쓰면 모든 호스트로부터의 접속을 허용한다. 마찬가지로 마이너스 문자만 쓰면 모든 호스트로부터의 접속을 불허한다. 그냥 아무런 인수없이 xhost라고 실행하면 현재의 상태를 보여준다. 보통은 로컬 호스트에서만 접속을 허용한다. 보통 X 윈도 프로그램들은 엄청난 시스템 자원을 사용하기 때문에 아주 높은 사양의 컴퓨터, 충분한 램( 64메가 이상, 그 이상일 때는 꼭 캐시램 512KB로 늘리기 바란다. 128 메가 이상일 때는 커널에게 옵션을 주어야만 된다는 사실을 알아야 한다), 충분한 스왑 파티션( 100메가 이상 )을 요구한다.

3.11 로그인하는 사용자에게 공고하기

/etc/issue.net이라는 파일에다 여러분이 원하는 공고문을 적어주면 된다. 그 파일에는 운영체계, 버전, 작동되는 머신 명칭(인텔 머신인지 알파인지 아니면 스팍인지), 날짜 등을 나타내는 특수문자가 들어갈 수 있다. 이 파일을 통해서 시스템 점검이라든지 커널 버전업으로 인한 서비스의 일시 중단 등을 공고할 수 있다.

/etc/issue.net 예제
%s %r (%m) %v (%t)
   지금 현재는 %d 입니다.
   환영합니다!
freeyong:~$ telnet localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Linux 2.0.23 (i586) #7 Wed Oct 23 05:03:07 KST 1996 (ttyp4)
   지금 현재는 11:14 on Saturday, 02 November 1996 입니다.
   환영합니다!

3.12 안전 터미널

사용자 중에서 가장 특수하고 막강한 권력을 가진 사용자는 바로 루트이다. 많은 크랙커들이 유닉스의 가장 아름다운 서비스 중 하나인 텔넷을 주공격 대상으로 하는 것은 놀라운 일이 아니다. 원격지에서 로그인하여 상대 컴퓨터를 마음껏 사용할 수 있다는 것은 큰 매력이기도 하지만 커다란 보안의 문제일 수도 있다. 크랙커들이 어떤 식으로든 첫 번째 목표로 세우는 것은 루트의 비밀번호를 알아내는 일이다. 그렇게 되면 그 시스템은 완전히 그의 손안에 들게 되는 것이다. 최대한 크랙커들을 예방하기 위해 안전 터미널(Secure Terminal)이라는 개념이 있다. 루트 사용자는 특별하므로 미리 정해진 몇 개의 콘솔, 그리고 안전하다고 생각하는 터미널만을 사용할 수 있도록 제한하는 것이다. 보통은 루트가 특별히 필요한 경우가 아니라면 원격지에서의 로그인, 관리는 행하지 않는 것이 좋다. 관련 파일은 /etc/securetty라는 파일이다. 알짜슬랙웨어에는 심각하다면 심각하다고 말할 수 있는 오류가 들어있다. 다음 파일을 살펴보도록 하자.

console
tty1
tty2
tty3
tty4
tty5
tty6
ttyS0
ttyS1
ttyS2
ttyS3
ttyp0
ttyp1
ttyp2
ttyp3

우선 루트는 콘솔 즉 자기 서버 앞에서 로그인할 수 있다. 그 다음은 가상 콘솔인 tty1부터 tty6 그리고 직접 접속된 시리얼 라인 또는 모뎀 접속인 ttyS0부터 ttyS3이 있다. 알짜웨어에서 문제가 되는 것은 바로 가상 터미널인 ttyp0부터 ttyp3를 추가한 것이다. 이것은 제작자의 오류이다. 만약 원격지에서도 루트의 관리를 할 수 있을 만큼 보안의 문제가 없는 곳에서는 놔두어도 좋다. 루트로 로그인하려고 하다가 안전 터미널이 아니라고 거부하는 모습을 한 번 보자.

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
 Linux 2.0.25 (i586) #14 Sun Nov 10 02:32:27 KST 1996 (ttyp5)

   지금 현재는 18:58 on Monday, 11 November 1996 입니다.
   환영합니다!

freeyong login: root
root login refused on this terminal.


다음 이전 차례