다음 이전 차례

2. 왜 passwd file을 숨겨야 하는가?

기본적으로, 대부분의 Linux 배포본들은 준비된 Shadow Suite를 포함하지 않는다. Slackware 2.3, Slackware 3.0, 다른 잘 알려진 배포본들이 그러하다. 이렇게 하는 이유중 하나는 원래의 Shadow Suite가 돈을 받고 재배포할 경우에 대한 저작권이 명확하지 않기 때문이다. Linux는 사용하기 편하게 포장(CD-ROM 배포처럼)한 뒤, 그에 대한 댓가로 돈을 받는 것을 허용하는 GNU의 저작권(Copyleft라고 불리우기도 한다)를 사용한다.

지금 Shadow Suite를 관리하는 Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl>씨는 재배포를 허용하는 BSD의 저작권을 따르는 저자로부터 source code를 받았다. 따라서, 지금은 저작권 문제는 해결되어서, 이후에 나오는 배포본에는 password에 shadow가 기본으로 사용될 수 있을 것이다. 그때까지는 당신 스스로 설치해야 된다.

CD-ROM으로부터 배포본을 설치했다면, 비록 배포본이 Shadow Suite를 설치하지 않았더라도, CD-ROM에서 Shadow Suite를 원하는 몇몇 file들이 있을 것이다.

어쨌든, Shadow Suite 3.3.1, 3.3.1-2, shadow-mk는 login program과 suid root를 쓰는 program에 보안 허점이 있고, 더 이상 쓰지 말아야 한다.

모든 필요한 file들은 anonymous FTP나 WWW을 통해서 얻을 수 있다.

Shadow Suite를 깔지 않은 Linux system에서는, password를 포함한 사용자 정보는 /etc/passwd에 보관되어 있다. password는 암호화되어서 (encrypted) 저장된다. 만일 암호학의 전문가에게 묻는다면, 그는 password는 encrypt된 형식이라기 보다는 encode된 형식으로 되어 있다. 이유는 crypt(3)을 적용할 때, text는 null로 하고 password를 key로 사용하기 때문이라고 한다. 따라서 이 문서에서는 encode된이라는 말을 쓸 것이다. (역자주 : 사전에는 encode와 encrypt를 같은 뜻으로 사용하고 있읍니다. - 암호로 바꿔쓰다 - 라는 뜻입니다만, 암호학을 전공하신 분들에게는 뉘앙스가 다를 것같습니다. 이에 대한 보충 바랍니다.)

password를 encode하는 데 사용되는 algorithm은 기술적으로는 단방향 hash function과 같은 방법으로 간주되고 있다. 이 것은 순방향으로는 계산하기 편하게 되어 있지만 역방향은 연산이 매우 힘들게 되어 있다. 사용된 algorithm에 대한 자세한 설명은 section 2.4나 crypt(3) manual page에 있다.

사용자가 password를 선택하거나 할당받을 때, password는 salt(소금?)라고 불리는 무작위로 생성된 값과 같이 encode된다. 이것은 어떤 password든지 4096가지의 다른 방법으로 저장될 수 있다라는 얘기다. salt 값은 encode된 password와 같이 저장된다.

사용자가 login하고 password를 사용하면, salt는 encode되어 저장된 password에서 뽑혀져 나온다. 그다음 입력된 password와 salt가 같이 encode된다. 그리고, encode되어 저장된 password와 비교한다. 그 결과, 서로 같다면 사용자는 인증된다.

무질서하게 encode된 password를 획득해서 원래의 password로 되돌리는 것은 계산상으로는 힘들다(그러나 불가능하지는 않다). 그러나, 적지 않은 사용자가 사용하는 system이라면, 적어도 몇몇 password는 일상단어로 이루어져 있다 (또는 간단한 변종이다).

system cracker들는 이런 것을 알고, 자주 쓰이는 password들과 단어의 사전과 가능한 4096가지 salt 값을 사용해서 encrypt을 행할 것이다. 그다음에 그들은 그들의 database에 있는 당신의 /etc/passwd file의 encode된 password와 비교할 것이다. 일단 하나라도 일치한다면 그들은 또다른 계정의 password를 가지게 되는 셈이다. 이는 dictionary attack(사전 공격?)이라 고 불리우고, system에 허가되지 않은 접속을 얻을 때 쓰는 가장 보편적인 방법중 하나이다.

생각해보라, 8문자된 password가 4096 * 13문자열로 encode된다. 그리고, 400,000개의 일반 단어, 이름, password, 약간의 변형들로 이루어진 사전은 4G Byte hard를 쉽게 채울 것이다. 공격자들은 이런 종류의 것이 필요하고, 맞는 지 검사해 볼 필요가 있다. 만일 10000 달러이하로 이런 4G byte짜리 hard를 가질 수 있다면, 대부분의 system cracker들에게는 충분하다.

또한, cracker가 당신의 /etc/passwd file을 이미 가지고 있다면, 그들은 /etc/passwd file에 포함되어 있는 salt 값만 가지고 사전을 encode하면 된다. 이 방법은 200 Megabyte의 공간과 486급 computer를 가지고 있는 보통 청소년이면 이용할 수 있다.

심지어 많은 공간없이, crack(1)과 같은 utility들은 최소한 충분히 많은 사용자를 확보하고 있는 system의 password를 2개정도는 깰 수 있다 (user가 자기 자신의 password를 고를 수 있는 system이라고 한다면).

/etc/passwd file은 user ID와 group ID와 같은 대부분의 system program에서 쓰는 정보를 가지고 있다. 게다가 /etc/passwd file은 "모두 읽기 가능"으로 남아 있어야 한다. /etc/passwd file을 아무도 보지 못하게 하면, 제일 먼저 ls -l 명령이 이제 user 이름대신 user ID를 출력하는 것을 보게 될 것이다!

Shadow Suite는 password를 다른 file(대개 /etc/shadow)에 위치시킴으로써 이 문제를 해결한다. /etc/shadow file은 어느 누구도 볼 수 없도록 되어 있다. root만이 /etc/shadow를 볼 수 있고, 쓸 수 있다. 어떤 program (xlock 같은)은 password를 바꿀 수 있는 권리를 원하지 않는다. password를 확인할 수 있으면 된다. 이런 program들은 suid root로 실행되거나, /etc/shadow를 읽기만 할 수 있는 shadow로 group을 바꾸어 주면 된다. 그러면 program은 sgid shadow로 실행시킬 수 있다.

password를 /etc/shadow file로 옮겨 줌으로써, dictionary attack를 하기 위해서 encode된 password들에 접근하는 공격자들은 효과적으로 방해할 수 있다.

추가적으로 Shadow Suite는 몇가지 괜찮은 기능을 더 가지고 있다:

Shadow Suite를 설치하는 것은 좀 더 보안이 강화된 system으로 만들어 준다. 그러나, Linux system의 보안을 강화시켜주는 다른 많은 것들이 있고, 따라서 궁극적으로 다른 보안 도구나 관련된 사안을 다루는 Linux Security HOWTO series가 생길 것이다.

알려진 취약점을 포함한 Linux 보안 문제에 대한 정보를 얻으려면 Linux Security home page를 방문하기 바란다.

2.1 passwd file을 은폐하기를 주저합니까?

다음과 같은 환경들에서는, Shadow Suite가 좋은 대안이 될 수 없다:

2.2 /etc/passwd file의 형식

shadow의 세례를 받지 않은 /etc/passwd file은 다음과 같이 구성되어 있다.

username:passwd:UID:GID:full_name:directory:shell
각요소는:
username

사용자 (login) 이름

passwd

encode된 password

UID

숫자로 된 user ID

GID

숫자로 된 기본 group ID

full_name

user의 실제 이름 - 실지로 이 field는 GECOS (General Electric Comprehensive Operating System: 일반 전자적 종합 운영 체계?) field라고 불리우며, 단지 실제 이름보다는 다른 정보를 가질 수 있다. Shadow 명령들과 manual page는 이 field를 comment로 다룬다.

directory

사용자의 home directory (Full pathname)

shell

사용자의 login shell (Full pathname)

예를 들면:

username:Npge08pfz4wuk:503:100:Full Name:/home/username:/bin/sh
Np는 salt이며, ge08pfz4wukencode된 password이다. encode된 salt/password는 kbeMVnZM0oL7I가 될 수도 있고, 둘은 같은 password를 가리킨다. 같은 password에 대해서 4096개의 다른 encoding이 존재할 수 있다. (예를 든 password는 'password'이며, 상당히 나쁜 password이다).

shadow suite가 설치되면, /etc/passwd file은 다음처럼 바뀐다:

username:x:503:100:Full Name:/home/username:/bin/sh
두번째 field의 x는 아무 것도 아니다. (공간만 차지하고 있을 뿐이다.) /etc/passwd file의 형식은 전혀 바뀌지 않았다. 단지 encode된 password를 포함하지 않을 뿐이다. 이는 /etc/passwd file을 읽기만 할 뿐 password를 검사하지 않은 program은 아무 이상없이 돌아간다는 것을 의미한다.

이제 password가 shadow file(대부분 /etc/shadow file)로 재배치된다.

2.3 shadow file의 형식

/etc/shadow file은 다음과 같은 정보를 갖고 있다:

username:passwd:last:may:must:warn:expire:disable:reserved
각 요소는:
username

사용자 이름

passwd

encode된 password

last

최근의 password를 바꾼 날 (1970, 1, 1일부터 계산한 날수)

may

password를 바꾼 다음, 또 바꾸기 위해 기다리는 날수 (다음 password로의 변경 유예기간)

must

다음 password로 바꿀어야 할 때까지의 기간 (현 password 유효기간)

warn

password가 만료되기 전에 user에게 바꿀 것을 경고하는 기간

expire

password가 만료된 뒤, user 계정 사용이 불가능하기까지 기간

disable

계정이 사용 불가능하게 된 날(1970, 1, 1일부터 계산한 날수)

reserved

남겨둠

전의 예제 경우 다음과 같다:
username:Npge08pfz4wuk:9479:0:10000::::

2.4 crypt(3)에 대해서.

crypt(3) manual 페이지에 의하면:

"crypt는 password를 encrypt하는 함수이다. 이는 Data Encryption Standard algorithm를 기반으로, (무엇보다) key를 찾는 기계적인 방법이 이용되기 힘들도록 약간의 변형이 가해져 있다.

key는 사용자가 입력한 password이다. [encode되는 string을 전부 NULL이다.]

salt은 [a-zA-Z0-9./]로 이루어진 집합으로부터 고른 두문자로 이루어진 문자열이다. 이 문자열은 4096개 경우중의 하나로 algorithm이 혼란스럽게 보이려는 목적으로 쓰인다.

key의 각 문자의 하위 7 bit을 취함으로써, 56-bit key가 주어진다. 이 56-bit key는 일정한 문자열을, 반복해서 encrypt하는 데 쓰인다. 결과는 13개 ASCII 문자열로, encrypt된 password를 가리킨다 (처음 두개 문자는 salt 그 자신이다). 결과값은 매번 호출될 때마다 다시 쓰이는 고정된 data를 가리킨다.

경고: key space는 2**56, 즉 7.2e16 가능한 값으로 이루어져 있다. key space를 샅샅이 뒤지는 것은 거대한 병렬 computer를 사용하면 가능할 것이다. crack(1)와 같은, 대부분의 사람들이 password로 삼는 key space의 특정 부분을 찾는 software가 있다. 따라서, 최소한 password를 선택할 때, 자주 쓰이는 단어나 이름은 피하기 바란다. passwd program을 사용하여, 찾기 쉬운 password를 선택하는 지 검사하기를 바란다.

DES algorithm, 그 자체는 가끔 crypt(3) interface를 사용하는 것이 다른 password 인증을 위한 어떤 것보다 더 나쁜 선택으로 만들어 버리는 경향이 있다. 보안 강화를 위해서 crypt(3)를 사용하려고 한다면, DES만 사용하지 마라: encryption에 대한 좋은 책과 널리 쓰이는 DES library들을 구하라."

(역자주 : 원문은 The DES algorithm itself has a few quirks which make the use of the crypt(3) interface a very poor choice for anything other than password authentication. If you are planning on using the crypt(3) interface for a cryptography project, don't do it: get a good book on encryption and one of the widely available DES libraries." 입니다. 그중에서 don't do it: get ...부분이 매우 애매합니다. it이 무얼 가리키는 건지 명확하지 않습니다. 일단, get ...을 권유하는 것으로 추측하고 번역을 했는 데...)

대부분 Shadow Suite들은 password의 길이를 16문자로 늘이는 code를 포함한다. des의 전문가들은 이를 권하지는 않는다. 왜냐하면 전반부를 encoding한 뒤, 긴 password의 후반부를 encoding하는 단순한 방법이기 때문이다. crypt의 방식대로라면, 긴 password를 사용하지 않는 것보다 더 취약한 password를 만들 수 있다. 더우기, 사용자가 16문자나 되는 password를 기억하기 힘들다는 측면도 있다.

crypt 방법과 호환성을 지니면서, 긴 password를 지원하고 더 강화된 인증(특히, MD5 algorithm)을 할 수 있는 방법이 연구중이다.

encryption에 대한 책으로 다음을 권한다:

        "Applied Cryptography: Protocols, Algorithms, and Source Code in C"
        by Bruce Schneier <schneier@chinet.com>
        ISBN: 0-471-59756-2


다음 이전 차례