[리눅스] 계정 패스워드와 관련된 파일 (/etc/passwd, /etc/shadow)
리눅스의 계정 관리 파일
리눅스에서는 파일로 사용자 계정을 관리합니다.
계정을 생성할 경우 다음과 같은 파일에 내용이 추가됩니다.
/etc/passwd : 계정을 관리하는 파일
/etc/shadow : 패스워드를 관리하는 파일
/etc/passwd 파일 구조
리눅스 시스템을 사용하려면 로그인을 해야 하며, 로그인을 할 때는 사용자 ID와 패스워드를 입력해야 한다. 사용자가 패스워드를 입력하면 리눅스는 /etc/passwd 파일에 있는 패스워드와 패드워드를 암호문(해시함수)으로 비교하고 해당 값이 동일하면 로그인하는 구조이다.
/etc/passwd 파일에는 해시로 암호화된 패스워드가 있지만, /etc/passwd에 저장하지 않고 pwconv
명령을 실행하여 /etc/shadow 파일에 패스워드를 저장할 수도 있다. 만약, 다시 패스워드를 shadow 파일에서 passwd 파일로 이동하고 싶다면 pwunconv
명령을 실행하면 된다
root : x : 0 : 0 : root : /root : /bin/bash
root | x | 0 | 0 | root | /root | /bin/bash |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
한 줄의 각 항목은 콜론 문자(:)에 의하여 분리되어 있으며 총 7개의 필드로 구성되어 있다.
- 사용자 명(ID)
- 사용자 패스워드.
x
로 되어있는 것은/etc/shadow
파일에 암호화되어 저장되어 있다는 의미. - 사용자 ID 를 의미하며 root 경우
0
adduser 스크립트에 의하여 부여됨. - 사용자가 속한 그룹 ID 를 의미하며 root 경우
0
- 사용자 계정 이름 (정보)
- 사용자의 홈 디렉토리
- 사용자가 기본으로 사용하는 쉘 종류 지정
/etc/shadow 파일 구조
root : &6$zF24Dfs5&...(생략) : 15426 : 0 : 99999 : 7 : : :
root | &6$zF24Dfs5&… | 15426 | 0 | 99999 | 7 | |||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
한 줄의 각 항목은 콜론 문자(:)에 의해 분리되어 있으며 총 9개의 필드로 구성되어 있다.
- 사용자 명(ID)
- 패스워드를 암호화시킨 값. 앞에
!
가 있으면 잠긴 상태 (::) : 패스워드가 필요없다는 것을 나타낸다. (:*:) : 계정을 막아두었다는 것을 나타낸다. - 1970-01-01 날짜부터 패스워드가 수정된 날짜의 일수를 계산한 값
- 패스워드 최소 유지기간
0
이면 언제든지 바꿀 수 있다는 의미. - 패스워드 최대 유지기간
99999
는 오랫동안 패스워드를 바꾸지 않았다는 것을 의미. - 패스워드 만료 경고기간
패스워드 만료 전 경고 메세지가 나오는 일수
ex) 만료일이 90일이고, 만료 경고기간이 7일이면 83일부터 90일까지 7일동안 경고메지니가 나오다 91째 만료된다. - 계정 잠김으로부터 남은 일수(패스워드 만료 후 계정이 잠기는 일수)
- 계정 만료 일자(비어있으면 만료 없음)
- 예약 필드(사용되지 않음).
chage
명령어는 shadow 파일을 읽어서 패스워드 만료 정보를 확인할 수 있는 명령어이다
chage -l [사용자명]
/etc/shadow 내 2번째 필드
[$Hashid $Salt $Hash vlaue]
Hashid
적용된 단방향 해시 알고리즘을 나타냅니다.
사용되는 Scheme은 1.MD5 2. BlowFish 5. SHA-256 6. SHA512
주로 $1
, $5
, $6
이 많이 사용되는 HashID입니다.
Salt
해시는 기본적으로 단방향
함수이므로 이미 수행된 결과값을 이전값으로 복호화가 불가합니다.
공격을 시도하는 해커들은 레인보우테이블을 구비하는데, 여기서 레인보우테이블은 모든 해시의 쌍들을 미리 구해둔 데이터로 이를 이용하여 빠르게 대입해 패스워드를 크랙할 수 있습니다.
그래서, 이 공격을 힘들게 하기 위해 중간에 OS 내에서 생성하는 임의의 값인 Salt를 추가합니다.
마치 음식 간을 맞추기위해 소금을 첨가하는 것과 마찬가지로 Salt를 추가해서 암호화 강도
를 높이는 역할을 합니다.
실제로 passwd 명령로 똑같은 암호로 변경한 후 shadow 파일을 확인해보면 값이 달라져있는 것을 확인할 수 있습니다.
이는 패스워드를 변경할 때마다 Salt 값이 변하기 때문입니다.
즉, 패스워크 크랙하기 위해서는 Salt 값을 알아야 하며 해당 Salt 값을 모르면 레이보우 테이블을 가지고 있어도 의미가 없게 됩니다.
Hash Value
HashID 에 따른 해시 방법과 Salt 값을 가지고 해쉬 함수를 수행한 결과.
관련된 리눅스 명령어
-
passwd [계정]
계정 비밀번호 설정옵션 설명 -s 사용자의 패스워드에 대한 정보 표시 -d 계정 비밀번호를 삭제 -l 계정 비밀번호 잠금 (로그인 잠금) -u 계정 비밀번호 잠금 해제 -n 사용자가 암호를 바꾸지 못하는 Min day 설정 -x 사용자 암호 변경없이 사용 가능한 Max day 설정 -i 사용자 패스워드가 만료된 후 실제로 로그인이 불가능해질 때까지의 기간 설정 -e 다음 로그인 시 무조건 패스워드를 변경하도록 하는 옵션 -w 패스워드 만료 전 경고 날짜를 지정 -
chage
사용자 패스워드를 관리하는데 사용. /etc/shadow의 날짜와 관련된 필드의 설정을 모두 변경할 수 있는 명령어옵션 설명 -l(대문자 : L) 사용자 패스워드에 대한 정보 표시 -d 최근 패스워드를 변경한 날을 수정 (/etc/shadow 3번째 필드) -m 패스워드 변경 후 최소로 사용하는 날 지정 -M 설정한 패스워드의 만기일을 지정 -I (소문자 : i) 패스워드 만기일 이후 실제 패스워드가 사용 불가능해질 때까지의 기간 -W 패스워드 만기 전 변경을 요구하는 경고 날짜 지정 -E 계정이 만기되는 날을 지정 -
pwconv
일반 패스워드에서 shadow 패스워드로변경
하는 명령어. 수행되고 나면 /etc/passwd 의 내용 중 두 번째 필드에 있는 암호화된 패스워드 부분만이 /etc/shadow 파일에 따로 저장. -
pwunconv
shadow 패스워드에서 일반 패스워드로되돌리는
명령어. /etc/shadow 파일에 보관되었던 패스워드를 다시 /etc/passwd 파일에 저장.
댓글남기기