Unix Linux

[펌] 유닉스 보안 4

_침묵_ 2005. 5. 31. 03:30
Practically Useful UNIX Security Administration
김휘강 (Sakai Kim)sakai@major.kaist.ac.kr

Contents
General Security Administration (이번 호)

개요


password 에 관련된 Secure Administration

I. General System Administration
1. System Administration (Intro)
System Administration 이란 무엇인가?

한마디로 줄여 이야기 하면 root 가 되어 system 을 관리하는 것을 말한다.

root 의 권한을 갖게 되었다는 것에는 많은 책임이 뒤따르게 된다.

시스템의 사활을 좌지우지 할 수 있을 뿐만 아니라, 사용자들의 account 도 임의로 삭제 할 수 있는 권한을 부여 받았다는 뜻이기 때문이다.

또 root 의 권한을 갖게 되면 타 사용자들의 메일이라든가 , 홈 디렉토리에 있는 어떠한 파일이라도 열람할 수 있게 되는데 이에 따라 윤리적인 문제도 많이 파생되고 있다. 실제로 천주교의 입김?/FONT> 강한 나라라든가, 프라이버시 보호가 잘 보장된 나라에서는 시스템 관리자가 될 때 부득이한 목적 외에는 사용자들의 파일들을 touch 하지 않는다는 것과 사용자들의 프로세스를 임의로 kill 하지 않고 , 사용자들의 메일을 절대 보지 않는 다는 것을 선서해야 한다.

또한 사용자들도 시스템을 사용하게 될 때 시스템에 피해를 주는 행위를 하지 않는다는 것과 , 시스템의 긴급 상황일 때에는 관리자가 자신의 파일들이나 메일들을 살펴 볼 수 있다는 것도 서명을 하게 되어 있다.

현재 국내에서는 이렇게 까지 엄격하지는 않지만 나름대로의 규칙을 정해 서로의 범위를 많이 침해하지 않도록 하고 있다.

또 항상 인지해 두어야 할 점은, 시스템 관리자는 봉사자의 입장이지 독재자가 아니라는 점이다. 항상 근면하게 시스템을 관리하며 사용자의 요구에 귀 기울이는 자세가 필요하다.

예전에는 많은 명령어들을 알아야 했고, 작업에 잔손질이 많이 가는 일들도 많았지만 요즘은 Menu based Interface 를 갖춘 관리 툴들이 많이 나오고 있어 관리에 상당히 편리해 졌다.

그러면, 이제 Administrator 가 관리하는 일에는 어떠한 것들이 있는가 살펴보자.

새로운 사용자의 account 를 추가한다.
사용이 중지된 사용자의 account 를 삭제한다.
새로운 하드웨어의 추가, 보수 , 유지한다.
시스템 데이터들의 백업 및 restoring 작업을 담당한다.
사용자들의 질문에 답해주며, 시스템 사용에 필요한 지식을 교육한다.
시스템을 항시 모니터링하면서 문제를 해결한다.
시스템의 부하를 많이 주는 프로세스가 있으면 양해를 구하고 프로세스를 죽인다.
시스템의 보안상에 문제가 없도록 버그를 끊임없이 패치 해나간다.
사용자에게 필요한 S/W 들을 지속적으로 인스톨하고, 업그레이드 시켜 나간다.
시스템 panic 이나 crash 시에 수리하고, 원인을 분석하여 고친다.
위에서 열거한 일들 말고도 많은 일들이 있을 것이다.

이번 호에서는 이러한 많은 일들 중에서 System Security 에 관련된 사항들을 중점적으로 다루어 보도록 하겠다.

II. General Security Administration
현재 UNIX 계열의 system에는 다양한 version 의 많은 종류의 OS 가 존재하고 있는데, 각각의 OS 마다의 많은 버그를 일일이 파악하기도 어려운 일이고, 모든 OS 를 전부 cover 한다는 것은 실제적으로 많은 어려움이 뒤따른다.

이번 달에는 system 관리를 어떻게 하면 보다 secure 하게 할 수 있는지에 대해 공통적으로 알아야 할 부분을 다루어 보겠다.공통적으로 파악해야 하는 부분 외에도 여러 OS 마다 같은 명령어가 다른 이름으로 존재하는 경우는 짚고 넘어가겠다.

1. General Security (Intro)
우선 해커(hacker) 들이 어떠한 방법으로 system에 침입하는 지를 파악한다면 이에 따라 system의 보안을 보다 효율적으로 관리할 수 있게 된다.

해킹에는 다음의 세가지 단계가 있다.(여기에서 해킹이라 함은 intruding 을 의미하고, 해커는 원래의 뜻이 아닌 intruder 를 속칭하여 쓰기로 한다.)

1.1 Intruding & Defensing

Intruding 의 세가지 단계

첫번째 단계로 remote host 에서 target host 의 쉘 액세스를 얻으려고 시도하는 과정이다.
최근의 많은 심각한 버그로 인하여 침입하고자 하는 host 의 shell access 를 할 수 없다 하더라도 root 권한을 얻어 낼 수 있기도 하지만 일반적으로 local host 로 침입한 후 OS 의 버그를 이용하여 root 의 권한을 얻는 것이 보통이다.

그럴 수 밖에 없는 이유로서 우선 remote 에서 직접 root 권한으로 명령을 실행시키도록 조작하는 것은 상당수준에 이른 해커들만이 구사할 수 있을 뿐 아니라 remote 에서 동작하는 버그 수는 local host 에서 OS 의 버그 수에 비해 상당히 적기 때문이다.

또한 remote 에서 조작을 하여 root 권한을 얻는다 하더라도 어짜피 증거 (system의 log 파일들)를 지우기 위해 침입을 해야만 하기 때문에 결과적으로 해커는 system 안으로 침입을 강행하게 된다.

두 번째 단계로 local host 침입 후 root privilege 를 얻으려 시도하는 과정이다.
이것은 우선 remote 에서 local host 로 잠입한 후에 OS 의 버그를 이용한다든지, 관리자 미숙으로 인해 system이 misconfigure 된 점을 이용한다든지 하여 system의 root 권한을 얻는 과정을 말한다.

세 번째 단계로 증거 입멸 후 재침입을 위한 백도어 설치하는 과정이다.

system 로그 디렉토리(보통 /var ) 에 자신의 해킹 과정과 관련된 로그파일들을 변조하거나 삭제하여 자신의 증거를 입멸한후, 재침입의 용이성을 위해 백도어를 설치하게 된다. 보통 백도어는 /bin/login , /bin/rlogin , /bin/passwd 등과 같은 setuid root program 들에 설치해 놓는 것이 보통이다.

자, 그렇다면 이와 같은 해커의 침입에 대비하여 관리자들은 어떠한 방법으로 system을 방어해야 하겠는가?


Defensing 의 세가지 단계

첫번째 단계는 "Network Security 를 통한 침입 방지" 이다.

해커가 remote 에서부터 아예 침입할 수가 없다면, 즉 자신의 host가 Network 관련된 버그가 아무것도 없다면, 자신이 관리하는 host 에 OS 버그가 많이 존재한다 하더라도 해커는 침입을 할 수 없을 것이다.

이처럼 자신의 host 를 network 상에 구동 시켜 놓았을 때 아무런 문제점이 없도록 하여 (system 무결성- system Integrity) 자신의 host가 vulnerable 하지 않도록 하는 것이 Network Security 이다.

두 번째 단계는 "Host Security 를 통한 root 권한 노출 방지"이다.

해커가 remote 에서 자신의 host로 침입을 하는데 성공하여 shell access 권한을 얻게 되었다고 했다고 하더라도 자신의 host 내부에 아무런 security 상의 문제점이 없다고 한다면 해커는 해킹에 실패를 하게 된다.

이런 식으로 자신의 호스트 내부의 misconfiguring 된 사항들을 정상적으로 고쳐 놓는 것, 또한 자신의 system에서 사용중인 OS 의 버그를 패치하는 Administration 과정을 Host Security 라고 한다.

세 번째 단계는 "Administration 을 통한 침입자 추적, 백도어 제거" 이다.

현재 자신의 host 가 해킹을 당했는지 이상한 기미가 보이는 경우 적절히 대처하여, 해커가 설치해 놓고 나간 백도어를 찾아내어 없애야 하고, 시스템에 심각한 피해를 입혔다면 이를 추적할 수도 있어야 한다.

아직 많은 대학의 경우 시스템 관리자를 전문 관리자가 아닌 미숙한 학생들에게 맡기는 경우가 대부분이므로 자신의 시스템이 해킹을 당했는지조차 모르는 경우가 많고, 보안에 아예 무관심한 경우도 많이 있어서 문제가 되고 있다.

이제, 보안의 인증의 가장 기본이라 할 수 있는 password 관리에 대해 알아보기로 하자.

2. General Security (password Security)
2.0 /etc/passwd 파일의 구조
UNIX 시스템은 각 사용자들의 password 및 기타 정보를 /etc/passwd 에 보관하고 있다. vi 나 cat 을 이용하여 이 file 을 살펴보자.

(단, 보는 방법이 어떤 시스템을 쓰느냐에 따라 다르다. 위는 일반적인 경우이고


NIS 시스템을 이용하는 경우: cat /etc/passwd 나 ypcat passwd 를 한다.


NetInfo 시스템을 이용하는 경우: nidump passwd / 를 한다.)

/etc/passwd 파일은 6 개의 colon 으로 구분되어져 7 개의 필드로 구성이 되어 있다.

username:password:UID:GID:User's Information:home directory:login shell

예:

sakai:JpCRcHUZgpvGs:501:100:Sakai Kim:/home/sakai:/bin/tcsh

1번째 field: User Name (login name)은 sakai 이다.

2번째 field: Password 가 encrypt 된 부분으로 요즘의 대부분의 OS 에서는 기본적으로 C2 Level 이므로 password 의 encrypt 된 내용을 따로 다른 파일에 저장한다.

(이 파일은 OS 에 따라 다르다. SunOS 4.x 에서는 /etc/security/passwd.adjunct 로 저장이 되고, Solaris 2.x 에서는 /etc/shadow 에 저장이 된다.)

아마 여러분들이 사용하는 대부분의 OS 에서는 다음과 같이 되어 있을 것이다.

sakai:x:501:100:Sakai Kim:/home/sakai:/bin/tcsh

또는

sakai:##sakai:501:100:Sakai Kim:/home/sakai:/bin/tcsh

그리고 참고로 TCSEC(Trusted Computer System Evaluation Criteria)에 대해 말해볼까 한다.이는 시스템 보안의 표준 등급을 나누어 둔 것인데 D Level 부터 A Level 까지 등급을 나누고 있다.레벨들 사이의 관계는 D -> A 로 갈수록 , 또 같은 레벨에서는 숫자가 클수록 보안성이 좋음을 의미한다.

========================[참고: TCSEC ]===================================

Division D: Minimal Protection
보안이 전혀 고려되어 있지 않는 시스템 즉, PC 처럼 외부에 완전히 공개되어 있는 경우.

예: MS/DOS, Macintosh, Atari Amiga

Division C: Discretionary Protection
C1 Level: Discretionary Security Protection
사용자 간에 서로 침범할 수 없게 되어 있다.

rwx 의 permission 조정과 owner, group, other 등을 이용하여 자신의 정보를 보호 할 수 있다.

데이터는 모두 사용자 단위로 접근의 허가를 줄 수 있어서 어떤 사용자는 특정한 정보에 대하여 사용할 수 있는 권한이 있다. 그리 강력한 보안은 아니고 다른 사용자가 다른 사람의 파일을 마음대로 할 수 없다는 정도이다. 보통의 UNIX 시스템의 대부분이 이에 속한다.

C2 Level: Controlled Access Protection
C1 level보다는 조금 더 엄격해진 정도에 불과하지만 C2 level에 이르러 비로소 보안상 허점을 대폭 줄였다고 할 수 있다. C1 의 기준을 충족시키며, 사용자 각각의 행동을 검사할 수 있는 audit , log 기능 등이 더 추가되었으며, 특징적으로 passwd 의 두 번째 필드를 다른 파일에 저장하여 관리자 외에는 볼 수 없도록 해두었다.요즘의 대부분의 UNIX 시스템과 VMS(DEC) 나 AOS/VS(Data General), VM/SP,NOS 등이 이에 속한다.

Division B: Mandatory Protection
B1 Level: Labeled Security Protection
C2 level의 기준을 충족시킨다. 각각 데이터에 보안 level을 설정하여, 낮은 보안 level을 지닌 사용자는 고 level의 정보에 접근이 금지되도록 되어있다.기밀 등급별로 Mandatory Access Control 을 할 수 있도록 했다.System V/MLS 등이 이에 속한다.

B2 Level: Structured Protection
B1 의 기준을 충족시키며 각 레벨의 특권 사용자는 자신의 작업에 대한 최소한의 권한만을 부여 받도록 해 두었다.보안 정책을 시스템 내에 일정하게 유지하고 있어야 한다.데이터를 access 하는데 필요되는 접근방법으로 체계화된 보호시스템이 구축되어야 한다.

예: Multics, Trusted XENIX

B3 Level: Security Domain
B2 의 기준을 충족시키며 추가적으로 H/W 자원을 포함한 보안 관리자 기능 및 위험시 스스로 탐색을 하며, 최악의 경우 스스로 시스템을 정지시키는 기능까지 포함되어 있다.운영체제 내부에 보안과 관련된 code와 관련이 없는 것은 모두 제거되어야 한다. 또한 모듈을 작게 하여 분석을 쉽게 해야 한다.즉 보안 분석과 테스트가 이루어 질 수 있어야 한다.

Division A: Verified Protection
A1 Level: Verified Design
수학적으로 secure 하다는 것이 증명된 시스템으로서 현존하지 않는다.

========================[참고: TCSEC ]===================================

3번째 field: User ID Number 가 기록되는 필드이다.

4번째 field: Group ID Number 가 기록되는 필드이다.

5번째 field: GECOS 필드라고도 하는데, 사용자의 Real-Name 이나, 전화번호 등의 User Information 이 저장되는 필드이다.

6번째 field: User 의 home directory 위치를 절대경로로 기록하는 필드이다.

7번째 field: User 가 사용하는 shell 의 위치를 절대경로로 표시한 필드이다.

요즘의 OS 들은 보통 C2 Level 이지만 아직도 아래와 같이 encrypted 된 password가 /etc/passwd 에 노출이 되어 있는 C1 시스템의 경우에는 C2 레벨로 업그레이드할 것을 강력히 권한다.

sakai:JpCRcHUZgpvGs:501:100:Sakai Kim:/home/sakai:/bin/tcsh

이렇게 encrypt 된 password 필드를 Crack 등의 프로그램에 입력하면 간단하고 단순한 password인 경우 password가 무엇인지를 알아 낼 수 있게 된다.시스템 내부에 침입한 해커가 이런 식으로 다른 사용자의 password를 알아낸 뒤 다른 사용자의 account 를 도용할 수 있게 되므로 C2 레벨을 유지하는 것이 요구된다.

C2 레벨로 업그레이드를 해주는 tool 로 C2conv 가 있다.single 사용자 상태에서 이 프로그램을 실행시키면 C2 Level 로 업그레이드 시켜준다. 그리고 C2 convert 시 문제가 생기면 C2unconv 를 이용하여 다시 복귀시킬 수 도 있다.

C2conv 이외에도 Linux 용의 shadow 패키지 같은 것도 C2 레벨로 업그레이드 시켜주는 툴의 좋은 예가 될 것이다.

2.1 password가 노출되지 않도록 한다.
해커가 remote 상에서 침입하기 위해서는 targethost 의 username 과 password 가 필요할 것이다. 그래서 해커는 이를 어떻게든 알아내려 애를 쓰는데, 단순히 guessing 을 이용하는 저수준 방법도 있을 수 있겠지만, 대부분의 해커는 이를 얻기 위해 Sniffing 을 시도한다.

다음은 sakai.kaist.ac.kr 란 호스트에서 sniffing 을 하는 예이다.

sakai# ./sniffit
Log started at => Mon Apr 8 20:29:04 [pid 10937]

-- TCP/IP LOG -- TM: Mon Apr 8 20:29:44 --
PATH: sakai.kaist.ac.kr(1270) => cenda.kaist.ac.kr(telnet)
STAT: Mon Apr 8 20:29:48, 30 pkts, 77 bytes [TH_FIN]
DATA: (255)(253)^C(255)(251)^X(255)(251)^_(255)(251)
(255)(251)!(255)(251)"(255
)(253)^E(255)(251)#(255)(251)$(255)(250)^X
: IRIS-ANSI-NET(255)(240)(255)(253)^A(255)(252)^Aaragorn
: evenstar
: cls
: du -s -k *
: elm arwen
--
위의 예를 보면 알겠지만 sakai.kaist.ac.kr 에서 cenda.kaist.ac.kr 로 aragorn 이란 사용자가 evenstar 라는 password를 사용한다는 것을 알아 낼 수 있다.기본적으로 TCP 관련 패킷들은 encrypt 되지 않으므로 root password가 노출이 된다면 정말 큰일이라고 할 수 있다.이를 막기 위해서 관리자는 사용자들에게 password가 노출되지 않도록 주의해 줄 것을 주지시켜야 하는데 , 주지시킬 내용은 다음과 같다.

이 예는 가상의 어떠한 호스트의 관리자가 사용자들에게 주지시키기 위해 작성한 문서이다. 이 문서를 보면 관리자가 어떠한 면을 신경 써야 하는지를 쉽게 알 수 있을 것이다.

=====================================================================
sakai.kaist.ac.kr 을 사용하시는 사용자 여러분들께.

사용자 여러분, 현재 sakai.kaist.ac.kr 은 리포트 된 버그들은 모두 패치
를 하였으나, 여러분들의 password가 노출이 되는 경우 여러분들의 소중한
자료들이 누출되거나 잃어버릴 우려가 있으니 다음 사항들을 주지해 주시고
지켜주시면 감사하겠습니다.

password의 누출이 되지 않기 위해 다음 사항들을 지켜주십시오.

1. 현재 시스템 안에 ssh 이 설치되어 있습니다. ssh 를 이용하여 외부의
호스트로부터 접속을 하게 되면 안전하게 됩니다.
사용법은 % ssh sakai.kaist.ac.kr -l username 입니다.

2. password를 주기적으로 바꾸어 주십시오. 현재 password aging 을 하고
있지만, 자신의 ID 가 도용 당한 것 같은 경우에는root@sakai.kaist.ac.kr
로 e-mail 을 보내주시고, password 를 즉시 바꾸어 주십시오.

3. guessing 하기 힘든 password를 사용해 주십시오. 좋은 password는 특수
문자나 white space 를 포함하고 ,사전에 없는 단어들, 자신의 ID 와 무관
한 단어입니다.
예: " 까이~!@"

4. X windows 환경에서 login 을 하실 때에는 hanterm 이나 xterm 에 포함
되어 잇는 secure keyboard 사용해 주십시오. Ctrl 키를 누르고 동시에 마
우스의 왼쪽 버튼을 누르면 secure keyboard menu 를 popup window 에서 선
택하실 수 있습니다.

5. 현재 시스템 안에 pgp 가 설치되어 있으니 중요문서는 password화하여 보관
해 주시기 바랍니다.

6. 로긴시마다 last 명령을 이용하면 침입당했는지를 알 수 있습니다.

% last -3 sakai
sakai pts/12 eve.kaist.ac.kr Fri Nov 8 12:51 계속 로그인 중
sakai pts/0 cspc15.kaist.ac. Fri Nov 8 12:25 계속 로그인 중
sakai pts/0 cspc15.kaist.ac. Fri Nov 8 12:00 - 12:23 (00:22)

번거로우시더라도 준수해 주시면 감사하겠습니다.

시스템 관리자 김휘강 백
======================================================================
특히 최근 관리의 편의를 위해 sudo 를 이용하여 root privilege 를 일반 사용자들이나 staff 그룹, wheel 그룹들과 공유하는 경우가 많다.

예:

% id

uid=103(sakai) gid=101(wheel)

% sudo /sbin/shutdown -y NOW

Password:

(여기에서 root password를 입력치 않고 sakai 란 사용자의 password를 입력한다.)

하지만 원칙적으로 이는 위험한 일임을 알아야 한다.그룹에 등록된 사용자들의 password 만 누출이 되어도, root 의 password 가 누출되는 것과 마찬가지의 파급효과가 일어나기 때문이다.반드시 sudo 를 써야만 하는 경우라면 /etc/sudoers 등의 파일들이 root 만 read 퍼미션을 갖도록 조정해 주는 것이 좋다.su 명령어를 이용하여 주는 것이 sudo 보다는 더 안전하다.

예:
% su root -c "/sbin/shutdown -y NOW"
Password:

참고로 SCO UNIX 에서는 sudo 와 비슷한 명령어로 asroot (루트인양...) 라는 명령어가 있다. (/tcb/bin/asroot) 잡담이지만 SCO UNIX 는 국내에서 그다지 많은 점유율을 보이는 OS 는 아니지만, 시스템 관리 관련 툴의 GUI 가 타 OS 에 비해 상당히 뛰어나서 고정 팬들의 지속적인 사랑을 받고 있다.

이런 것들과 마찬가지로 요즘은 각 OS 마다 GUI 가 뛰어난 Integrated System Administration tool 들을 제공하고 있는 추세이다. (Solaris 의 admintool, HP-UX 의 sam , AIX 의 SMIT, VSM , Digital UNIX 의 setup, IRIX 의 Cadmin series , SCO UNIX 의 sysadmsh , scoadmin 등등)

2.2 Password Aging
위에서 예로 들은 가상적인 문서에도 적혀 있지만 아무리 사용자들에게 password를 주기적으로 바꾸어 달라고 주지를 시켜도, 게으르고 *무지한* 사용자들은 계속 추측하기 쉬운 password를 사용하며, 또한 password를 바꾸지 않게 마련이다. 이런 것을 강제적으로 시키기 위해 Password Aging (password 갱신) 를 수행할 필요가 있다.

Passwd aging

password aging 기능은 System V 에서 처음으로 구현이 된 기능으로, 일정한 시간이 흐른 후에는 password 를 로긴 시에 자동으로 바꾸도록 해주는 것을 말한다. password aging 을 지정해 주기 위해 shadow facility 에서는 /etc/shadow 파일에 직접 기록해 주거나, /bin/passwd 명령을 이용하거나, Administration tool 을 이용하여야 한다. /etc/shadow 파일을 사용하는 OS 들에는 Solaris 2.x , IRIX 등이 있다.

HP-UX 의 경우 9.x 에서는 손으로 기록해 주어야 하지만 10.x 인 경우 아주 강력한 Administration tool 인 SAM 을 통하여 간단하게 지정을 해 줄 수 있고, Solaris 의 경우 /etc/shadow 를 직접 편집하거나 admintool 을 이용하여 지정해 주면 된다.

물론 공통적으로 /bin/passwd 를 사용하면 지정을 할 수 있다.

먼저 /etc/shadow 파일의 각 필드를 살펴보자.

ID:encrypted password:lastchange:minday:maxday:warnday:inactiveday:expiredate

1번째 field: User Name 이 기록되는 필드이다.

2번째 field: 사용자가 입력한 password 가 password화 되어 저장되는 필드이다.

3번째 field: password 를 마지막으로 바꾼 날짜가 기록이 되는 필드이다.

4번째 field: 한번 password 를 바꾸었을 때 바뀐 password를 적용시켜야 하는 최소일수를 말한다.

즉 한번 password를 바꾸면 이 일수 동안은 password를 다시 바꿀 수 없게 된다.

5번째 field: 사용자가 한번 password 를 바꾸었을 때 바뀐 password를 사용할 수 있는 최대한의 일수를 기록하는 필드이다.

6번째 field: password 를 바꾸도록 warning 메시지를 보내는 일수를 기록한 필드이다.(즉 password 유효 만기가 다 차기 지정된 날수 전부터 메시지를 보내어 password를 바꾸기를 권고한다.)

7번째 field: password 가 expire 된지 며칠 후에 access 를 disable 시킬 것인지를 기록하는 필드이다.

8번째 field: 이 account 가 사용 중지되는 날짜를 기록하는 필드

이제 실제로 /bin/passwd 를 이용하여 aging 을 시키는 것을 살펴보자.

(Administration tool 을 사용하는 경우는 각 필드에 숫자만 기록하면 되므로 생략하겠다.)


관련된 /bin/passwd 의 옵션 (System V 계열의 /bin/passwd 경우임)

-n : minimum day

-x : maximum day

-f : 다음 로긴시에 무조건 password를 사용자가 바꾸도록 한다.

-s : password aging status 를 보여준다.

-a : 모든 사용자의 password aging status 를 보여준다.

-l : 사용자가 로긴 하지 못하도록 password를 lock 해놓는다.

-u : lock 을 걸어놓은 사용자의 password를 unlock 시킨다.

-d : 사용자의 password 를 삭제한다.

예:
# passwd -n 1 -x 158 sakai
(password를 바꾸고 바꾼 password를 158 일 동안 사용할 수 있다.)
# passwd -x 3 -n 30 username
# passwd -w 3 username
(password 를 최소 3일에서 최대 30 일 까지 사용할 수 있고, password 를 바꾸도록 만 3일전부터 경고를 보내게 된다.)

BSD 계열 UNIX 를 사용하는 경우에는 위에 열거한 옵션들과 매우 다르다. 그 이유는 초창기 BSD 계열 UNIX 에서는 shadow facility 를 고려하지 않았기 때문이다. 또 관련된 명령어로, AIX 의 경우 pwdadm (password Administration 의 약자)이 있다. AIX 4.1 의 경우 /etc/security/user 파일을 데이터베이스로 사용하고, AIX 3.2.5 의 경우 /etc/security/login.cfg 등의 파일에 관련된 내용을 저장한다.

2.3 좋은 password를 사용하자.
좋은 password란 타인이 알아내기 힘든 password를 말한다. 요즘의 OS 에서 제공되는 /bin/passwd 는 password 를 바꿀 때에 좋은 password 를 선택하도록 엄격히 관리하고 있다. 즉, 특수문자가 반드시 포함되어야 하고, 소대문자를 섞어 써야 하는 것 등을 규칙으로 정해 추측이 어렵도록 관리를 해준다.

그렇다면 반대로 나쁜 password 에는 어떠한 것들이 있을까? 다음과 같은 것들이 있다.

---------------------[BAD PASSWORD]---------------------------
* ID 와 같은 password
* 사용하는 시스템의 이름
* 컴퓨터의 호스트의 이름
* 영어사전에 나오는 단어 (boss , world .... )
* 전화번호
* 생일
* 키보드 위의 같은 선상에 있는 글쇠들의 연속.(qwert,asdf .....)
* 동일한 글자의 연속 (11111, eeeee .... )
--------------------------------------------------------------
나쁜 password를 사용하는 경우 crack 과 같은 password guessing 프로그램을 이용하여 password 를 알아낼 수 있게 되고, 이를 악용할 여지도 생기게 마련이다. 이를 막기 위해 관리자는 좋은 password를 사용할 것을 사용자들에게 주지시키고,주기적으로 password를 점검하여 쉬운 password를 사용하는 사용자들에게 password 를 바꿀 것을 권고해줘야 한다.

예전에는 관리자가 일일이 password 를 guessing 해내어 쉬운 password 를 사용하는 사용자를 찾기 위해 crack ,cops 같은 툴을 따로 설치해야 했지만, 요즘의 OS 에는 기본적으로 password checking tool 이 포함되어져 나오고 있다.

AIX 의 경우
* /etc/security/user 에 dictionlist가 저장되어 있는데 , pwdchecks 명령을 사용하여 사용자의 password 를 체크한다.

SCO 의 경우
goodpw facility 를 이용한다.

※ /usr/bin/goodpw 를 이용하기 위해 /etc/default/passwd 파일 안에 다음과 같은 사항을 지정해 둔다.

GOODPW = YES
DESCRIBE = /usr/lib/goodpw/describe
SUMMARY = /usr/lib/goodpw/summary
ONETRY = YES
CHECKDIR = /usr/lib/goodpw/checks



그 외의 경우
자기가 관리하는 OS 에 이러한 facility 가 지원되지 않는다면 passwd+ 나 npasswd를 사용하면 될 것이다.

passwd+ 는 /bin/passwd 의 약점을 보완한 것으로 자체의 decrypt 알고리즘이 있어서 간단한 password 를 사용하고 있는 사용자들에게 자동으로 메일을 보내어 주의를 주기도 하고 password aging (특정기간이 지나면 바꾸도록 메일을 보내어 체크 해 준다.) 기능이 있어서 사용자들의 비밀번호의 관리에 도움을 준다.

npasswd 는 텍사스 Austin 대학의 Clyde Hoover 에 의해 개발된 프로그램이다.이것도 passwd+ 과 유사한 기능을 가지고 있다.

이를 정리해 보면,


최소한의 password 의 길이를 조정할 수 있다.


사용자로 하여금 대소문자, 숫자. 마침표 등을 강요할 수 있다.


단순한 password 를 체크해 낼 수 있다.


호스트 이름과 호스트 정보를 체크해 낼 수 있다.


로그인 이름과 성명 등을 체크할 수 있다.


시스템 사전을 비롯하여 여러 사전의 단어를 이용하여 체크를 해 볼 수 있다.

이 툴들은 각 ftp 서버에서 쉽게 구할 수 있다.


npasswd

location:ftp://ftp.cc.utexas.edu/pub/npasswd/


passwd+

location:ftp://ftp.dartmouth.edu/pub/security/

또는 Crack 이나 COPS 를 이용해 보는 것도 좋은 방법이 될 것이다. Crack 이나 Cops 는 다음의 ftp 서버에서 쉽게 구할 수 있다.


COPS

Location:ftp://info.cert.org/pub/tools/cops/

C Program 버전도 있고 Shell script, Perl script 버전이 모두 존재한다.


Crack version 5.0 & Crack lib

Location:http://www.users.dircon.co.uk/~crypto/

ftp://info.cert.org/pub/tools/crack/

ftp://info.cert.org/pub/tools/cracklib/

최근에 나온 Crack 5.0 은 예전의 4.x 버전에 비해 password 추측하는 성능이 향상되었으며 gecos 필드의 체크를 보다 강력하게 해준다. 참고로 Crack 과 Cops 에 대해 살펴보겠다. 나중에 Security 관련 stuff 들에 대해 정리할 때 더욱 자세히 다루게 될 것이다.

=========================[Crack & Cops briefing]==============================
Cops 가 검사하는 부분

파일, 디렉토리 , device 의 퍼미션을 검사
쉽게 추측할 수 있는 password 를 검사한다.
/etc/rc와 /crontab 에 의해 실행되는 프로그램 검색
Set user id 파일들과 파일들의 퍼미션 조사
중요한 파일들의 CRC 조사
유저들의 홈 디렉토리와 .profile , .cshrc , .login과 .rhost 파일 체크의 퍼미션 조사
( 주어진 사용자를 체크하는 expert 시스템 기능)
anonymous ftp setup 조사
CERT 에서 발견한 버그와 보안의 허점에 관련된 파일을 알려준다.
NFS mount 와 /etc/host.eqiv 를 조사
/dev/kmem과 다른 디바이스 파일의 읽기/쓰기를 체크

Crack

% Crack
Crack 4.1f RELEASE, The Password Cracker (c) Alec D.E. Muffett, 1992
Invoked as: Crack
Usage: Crack [options] [bindir] passwdfile [...]
Or: Crack -network [options] passwdfile [...]
Options:-
-v - to produce verbose output
-nnicevalue - to run niced to 'nicevalue'
-rpointfile - to recover a crashed-out job
-Rpointfile - to recover (with verify) a crashed-out job
-f - to run in foreground (output to stdout)
-m - to mail the user a warning message if cracked

# Crack /etc/shadow

위의 명령을 돌리면 , Crack 이 프로세스로 되어 수행되게 되며 얼마 후
out.$HOSTNAME$$ 라는 이름의 화일로 저장이 되게 된다.

출력 파일에서 얻을 수 있는 결과

-----------------------------------------------------------------------
join: Guessed yddd (/bin/csh in passwd) [harmony] Lr95Q
join: Guessed skan (/bin/csh in passwd) [JinSeok] Psyjvi0Oa
join: Guessed gni (/bin/csh in passwd) [genius.] ZkUag
-----------------------------------------------------------------------

위의 예에서 보듯이, 쉽게 추측할 수 없을 것 같은 password도 알아내는
결과를 볼 수 있다.
단순히 영어로 된 단어만이 아니라 한글 단어를 2 벌식 영어단어로 옮긴
사전을 이용하여 crack database 를 구축한 경우도 있어, 단순히 한글을
영어로 옮겨서 치는 경우도 좋은 password라고 만은 볼 수 없다.

=========================[Crack & Cops briefing]==============================
2.4 /etc/passwd 파일 관리
Null password 의 문제점
우선 /etc/passwd 파일을 통하여 , NULL password인 사용자들을 체크 해 보는 것이 중요하다. password 를 사용하지 않는 경우 침입을 당하기 쉬워서 문제를 발생시킬 수 있기 때문이다. 일일이 확인하는 방법도 있지만 다음과 같은 awk 명령을 이용하면 쉽다.

% awk -F: 'length($2) find_idler.sh
#!/bin/sh
# 이번 달에 로그인 안한 사람 찾아내기
#
THIS_MONTH='date |awk '{print $2}''
last |grep $THIS_MONTH |awk '{print $1}' |sort -u > /tmp/users1$$
cat /etc/passwd |awk -F : '{print $1}' |sort -u > /tmp/users2$$
comm -13 /tmp/users[12]$$
/bin/rm -f /tmp/users[12]$$
^D

% sh find_idler.sh
audit
backup
bin

또한, 위에서 말한 외에, 시스템 관리자가 주의해야 할 것은 다음과 같다.


사용하지 않는 계정은 반드시 지운다. 또한 사용하는 계정이라고 하더라도, 사용자 이름 필드에, 만기일을 기입하여, 주기적(1달에 1회 정도)으로 이를 check하는 Shell Script를 수행하는 것이 좋다.


손님 계정(대체로 로그인 이름은 guest, anonymous, public, general, sonnim의 형태가 된다)은 사용이 끝나면 즉시 지운다.


password가 지정되지 않은 사용자나 uid(user id)가 0인 사용자를 찾아서 가급적이면 지우던가, 알려주도록 한다.

uid가 0인 계정을 알아내려면 다음과 같이 한다.

% awk -F: '$3 == 0' /etc/passwd

※잘 알려진 계정인, vendor, service, sysdiag, wheel 등과 같은 계정은 필요성 여부를 잘 판단해서, 불필요한 것은 지우고, 남길 것은 남기지만, 위에서 말했듯이, 절대로 uid를 0으로 해서는 안 된다.

위의 사항들에 대해 좀 더 깊이 들어가 보기로 하자.

NULL password 를 사용하는 계정이 야기하는 보안문제 I
"sync" 라는 계정은 보통 SunOS 에서 Null password 로 두어 아무 사용자나
로긴만 하면 sync 가 되도록 되어 있다.
하지만 이를 악용하여 다음과 같은 해킹이 일어나는 것이 가능하다.
--------------------------------------------------------------
% cat > exit.c ...
^C
$ LD_PRELOAD=
$ id
uid=daemon(1) gid=daemon(1)
$ ^D
%
--------------------------------------------------------------
위와 같이 아무리 보안에 신경을 썼다 해도 우선 Null password 인 상태라면
외부의 사용자가 뚫고 들어올 발판을 마련해 주는 것과 다를 바가 없다.
위의 스크립트는 sync 로 들어가면 원래는 초기 shell 이 없이 sync 명령어를
호출하게 되어있지만 그 대신 shell 을 띄우도록 조작을 해 놓은 것이다.
해커는 우선 저런 방식으로 뚫고 들어갔다면 다음에 들어가기 편함을 위해 chsh
이나 passwd -s 로 초기 shell 을 바꾸어 놓을 것이다.

NULL password 를 사용하는 계정이 야기하는 보안문제 II

$ grep '^[^:]*::' /etc/passwd
root::NQI1235sdq3.:0:0:Super User:/:/bin/csh
demo::7:17:Demo User:/home/demo:/bin/sh
::0:0:::
$ su ""
#

위와 같이 NIS 의 setup을 잘못하여 "::0:0:::" 과 같은 줄이 들어있는 경우
위와 같이 침입을 당할 수 있게 된다. 또한, root 권한을 갖는 uid 가 0
인 사용자의 경우, Null Password 라면 그대로 어떠한 사용자라도 login 을
하여 root 권한을 획득하게 되므로 반드시 Null Password 인 사용자를 두어서
는 안되겠다.

부득이 Null passwd ID 또는 UID=0 인 ID를 이용하는 서비스에서는, shell
access 를 제한 하는 것이 좋다.
----------------------------------------------------------------------
예:
anonymous FTP 의 경우 initial shell을 /bin/false 로 할당한다
/usr/lib/rsh (restricted shell) 을 이용하여 File System 을 제한되게
Access 하도록 한다.
----------------------------------------------------------------------


일일이 password 파일을 check 하기가 쉬운 일은 아니다. 특히 사용자의 수가 엄청나게 많은 경우는 OS 에서 제공해주는 프로그램을 이용하는 것이 좋다.


대부분의 System V 계열 UNIX, SunOS , Linux 의 경우

/sbin/pwdck 을 사용한다. 상당히 성능이 뛰어난 프로그램이다. 이와 마찬가지로 group 파일을 체크 해 주는 파일도 있다. /sbin/grpck 이다.


AIX 의 경우 pwck 를 사용한다.


예전의 /etc/passwd 파일과 현재 파일과의 비교

사용자가 상당히 많은 경우 password 파일에 새로운 사용자가 불법적으로 해커에 의해 추가되었다든지, 변조가 되었다든지를 한번에 눈치 채기가 어려워 진다. 그러므로 주기적으로 /etc/passwd 파일을 백업하는 것이 중요하다. 단, 시스템 내부에 백업파일을 두지 말고 반드시 하드카피나 백업테잎, 플로피 디스크 등을 이용하여 offline 상태에서 보관하도록 한다.

예:
# mcopy /etc/passwd a:
로 백업을 한 후, 나중에
# mcopy a:/passwd /tmp/old_passwd
# diff /etc/passwd /tmp/old_passwd

2.5 Password Security Administration (Further Study)
지금까지 아주 기본적인 패스워드 보안을 위해 해야 할 일들을 정리해 보았다. 이제 좀더 깊이 있게 다루어 보자.


Trusted System

Trust 란 말 그대로 "신뢰" 이다. 이 개념은 버클리 계열 유닉스의 r-(remote) 명령어들을 구현하면서 생긴 것이다. (rsh, rlogin, rcp, rdist...)

이를 적용하여 A 란 호스트가 B 란 호스트를 trust 하고 있으면, 즉 B 가 A 의 trusted 호스트이면 B 호스트의 사용자가 A 호스트에 로긴 하지 않고도 파일을 액세스 할 수 있으며, 또한 패스워드 인증 절차 없이 로긴 할 수도 있게 된다. 어떻게 보면 상당히 편리하지만 , 이것이 악용되어 현재 많은 보안 문제들을 낳고 있다. 여기에서 인증절차에 요구되는 파일이 $HOME/.rhosts 파일이다. 이 파일은 rlogin 으로 들어올 때에 아무런 패스워드 인증절차가 없이도 로그인을 허가해 줄 수 있도록 한다.

-------------------------------------------------------------------------
예:
% hostname
chiak

% cat .rhosts
baram.kaist.ac.kr sakai
chiak.kaist.ac.kr seoro

이제 baram.kaist.ac.kr 에서 chiak.kaist.ac.kr 의 sakai 란 유저로 rlogin 하는
예이다.

$ rlogin chiak.kaist.ac.kr -l sakai
Last login: Fri Mar 3 01:53:29 from baram.kaist.ac.kr
....
You have mail
$
-------------------------------------------------------------------------
비단 .rhosts 에 + + 가 적혀 있어서 모든 호스트의 모든 사용자로부터의 rlogin 시에 패스워드 인증을 하지 않겠다는 .rhosts 파일이 아닐지라도, 외부로부터의 인증되지 않는 로긴을 허가하게 되면 문제가 발생할 수 있으므로 아예 /etc/services 나 /etc/inetd.conf 에서 r-command 들을 disable 시키는 것이 좋다. .rhosts 는 개인사용자 단위에서의 패스워드 인증 생략을 위한 파일이지만 아예 시스템 자체에서 특정 호스트에서 들어오는 커넥션에서는 패스워드 인증을 하지 않겠다는 것을 지정할 수 있는데 여기에 사용되는 파일은 /etc/hosts.equiv 이다.

=============================================================================

예:

# cat /etc/hosts.equiv

gold.acs.com

silver.acs.com

adam.kaist.ac.kr



-@netgroup1

+@netgroup2



위의 파일이 의미하는 바는 gold.acs.com , silver.acs.com , adam.kaist.ac.kr

에서 들어오는 모든 유저에 대해서는 패스워드를 묻지 않고 들어오는 것을

허용하며, netgroup1 에 속한 모든 호스트에 대해서는 불가, netgroup2 에 속한

호스트들에 대해서는 허용을 표시한 것이다.

=============================================================================

이들 파일들은 차라리 사용을 하지 않는 것이 유리하며, 다음과 같은 명령을 이용하면 쉽게 지울 수 있다.

# cd /
# find . -name ".rhosts" -o -name ".netrc" -print -depth -exec rm -f {} \;
# rm /etc/hosts.equiv

다음은 자신의 호스트에 있는 .rhosts 파일들과 이를 소유하고 있는 아이디를 검색하는 스크립트 이다.

-----------------------------------------------------------------------------
#!/bin/sh
# Search for .rhosts files in home directories

PATH=/bin:/usr/bin:/usr/ucb:
export PATH

case $# in
1)
if test -f $1/.rhosts; then
echo "There is a .rhosts file in $1"
fi
;;
0)
(ypcat passwd; cat /etc/passwd) 2> /dev/null | \
awk -F: 'length($6)>0 {print command, $6}' command=$0 - | \
sort -u | sh
;;
*)
echo "usage: $0 [home directory]"
;;
esac
-----------------------------------------------------------------------------
다음은 자신의 호스트에 있는 .rhosts 를 모두 지울 때 사용하는 스크립트이다.

-----------------------------------------------------------------------------
#!/bin/sh
# Search for .rhosts files in home directories
# And delete them.

PATH=/bin:/usr/bin:/usr/ucb:
export PATH

case $# in
1)
if test -f $1/.rhosts; then
echo "The .rhosts file in $1 has been deleted"
rm -f $1/.rhosts
fi
;;
0)
(ypcat passwd; cat /etc/passwd) 2> /dev/null | \
awk -F: 'length($6)>0 {print command, $6}' command=$0 - | \
sort -u | sh
;;
*)
echo "usage: $0 [home directory]"
;;
esac
-----------------------------------------------------------------------------
이와 같이 hosts.equiv 나 .rhosts 들을 삭제했다고 해도 이러한 파일을 악용하는 해킹 유형에서는 .rhosts 파일이나 hosts.equiv 파일이 존재하는 경우 append 시키고 없는 경우에는 create 시키기 때문에 아예 /etc/hosts.equiv , ~root/.rhosts 를 /dev/null 로 링크 시키는 것이 좋은 해결책이라 할 수 있다.

이 외에도 좀더 강도 높게 시스템을 관리하려면 ssh 이나 S/Key 을 사용하는 것이 좋다.


ssh (Secure Shell:http://www.cs.hut.fi/ssh)

예:

% ssh baram.kaist.ac.kr -l sakai
Connection to baram.kaist.ac.kr was refused.
Using rsh. WARNING: Connection will not be encrypted.

하지만 ssh 을 이용하는 경우 시스템에 부하가 많이 걸리고 사용자들이 불편해 할 수도 있다.

언제나 그렇지만 엄격하게 시스템을 관리하는 것은 항상 사용자들의 편의와 trade off 하는 것임을 알고 적정한 수준에서 조정하는 것이 좋을 것이다.

이제 어느 정도 패스워드 관리하는데 필요한 지식이 쌓였으리라 생각이 된다. 하지만 passwd 는 시스템 관리의 첫 단계인 사용자 account 추가, 삭제에 필요한 가장 기본적인 내용일 뿐이다. 이제 다음 호에서는 process 를 관리하는 법 및 시스템의 로그들을 관리하는 것을 security 와 관련을 맺어 설명을 할 까 한다.



- 끝 -

※읽어주셔서 감사합니다.

(다음 호 예고)

General Secure Administration 2 부


Process 관리, 감시법


시스템의 로그관리 및 분석법. 관련 명령어 및 툴 소개

======================================================================

(footnote)

# 는 root shell 프롬프트를 뜻한다.

$ 은 일반 사용자의 borne shell 계열 쉘 프롬프트를 뜻한다.

% 는 일반 사용자의 C shell 계열 쉘 프롬프트를 뜻한다.

======================================================================



References

1. Essential System Administration, O'Reilly & Assoiates, Inc.

2. KUS Bulletin ; NULL Password 에 관한 문제점 - 이석찬

3. [General Security Technique - Practically Useful], 김휘강 ,제 4 회 WWW-KR Conference

'Unix Linux' 카테고리의 다른 글

[펌] so 파일 생성  (0) 2005.10.06
[펌] 유닉스 보안 2  (0) 2005.05.31
[펌] 유닉스 보안 3  (0) 2005.05.31