리눅스(유닉스) 시스템은 다중 사용자 시스템이므로 여러 사용자들이 같은 시스템을 사용한다. 즉 여러 사용자들이 같은 하드디스크를 사용하여 자신들의 파일을 관리한다. 따라서 다른 사용자들이 자신의 중요한 정보를 보거나 삭제할 수 있다. 따라서 리눅스 시스템은 모든 파일과 디렉토리에 그것을 액세스할 수 있는 소유자와 그룹에 대한 소유권(ownership)을 가지며, 그러한 파일과 디렉토리에 액세스할 수 있도록 해주는 허가권(permission)으로 접근을 제한 할 수 있다.
- 파일 구조
파일 리스트를 출력하는 ls 명령어로 출력되는 파일 구조에 대해서 자세히 살펴보자
[root@lsrg mk]# ls -l
total 19724
drwxr-xr-x 5 mk mk 4096 Jan 1 1998 Desktop
-rw-r--r-- 1 mk mk 2264064 Aug 2 14:52 Linux_first.ppt
[ls -al의 결과 분석]
total 22 (total block(1024byte) 수)
┌파일 소유자 ID ┌파일크기 파일명┐
drwxr-xr-x 3 root root 4096 Feb 5 12:17 .mc
│ └hard link 수 │ └파일 변경시간
파일 퍼미션 파일 소유자 그룹 ID
첫번째 필드는 유저, 그룹, 타인에 대한 퍼미션을 나타내며, 두번째는 링크수를 의미하며, 세번째는 소유자명, 네번째는 그룹명, 다섯번째는 파일 또는 디렉토리 사이즈를 의미하며, 여섯번째는 디렉토리 또는 파일이 만들어진 시간을, 마지막 필드는 파일명 또는 디렉토리 명을 의미한다.
나머지는 이해되리라 믿으며, 여기서는 첫번째 필드만을 살펴보겠다.
문자 |
r |
w |
x |
r |
w |
x |
r |
w |
x |
유저 허가권 그룹 허가권 타인 허가권
표 2.1 파일 유형 문자
문 자 |
파일 유형 |
- |
일반 파일 |
d |
디렉토리 |
b |
블록 단위로 읽고 쓰는 블록 장치 특수파일(예: 디스크(had, sdb), 테이프) |
c |
문자 단위로 읽고 쓰는 문자 장치 특수파일(예: 터미널(tty), 키보드) |
p |
파이프 |
s |
소켓 |
l |
심볼릭 링크 |
표 2.2 파일 유형에 따른 의미
모드 |
일반 파일 |
디렉토리 |
읽기(r) |
파일 내용을 읽을 수 있다. |
디렉토리가 포함하는 파일 목록을 읽을 수 있다. |
쓰기(w) |
파일 내용을 변경시킬 수 있다. |
디렉토리 내에서 파일을 생성하거나 삭제 할 수 있다. |
실행(x) |
파일을 실행 시킬 수 있다. |
cd 명령어로 디렉토리에 들어 갈 수 있다. |
- 퍼미션(permission)
퍼미션을 바꾸는 것은 심볼릭한 방법(상대적인 방법)과 절대적인 방법으로 나눌 수 있다.
? 상대적인 방법
[root@lsrg mk]# ls -l
total 1088
-rw-r--r-- 1 root root 541184 Sep 24 17:19 TodayOnly.pps
-rw-r--r-- 1 root root 559823 Sep 24 17:19 serverhosting.pdf
여기서 TodayOnly.pps 파일은 유저(root)는 읽고 수정할 수 있으며, 그룹(root)는 읽을 수 있으며, 그리고 타인 역시 읽을 수 있는 권한이 있습니다.
자 여기서 상대적인 방법으로 퍼미션(허가권)을 한 번 바꾸어 보자.
표 2.3 사용자 기호
모드 |
의 미 |
u |
소유자 |
g |
그룹 |
o |
그 밖의 사용자 |
a |
모든 사용자(위의 사용자 모두포함) |
표 2.4 연산자 기호
모드 |
의 미 |
+ |
퍼미션 추가 |
- |
퍼미션 제거 |
= |
퍼미션 유지 |
Case1) TodayOnly.pps 파일에 유저(root)는 읽고 수정할 수 있으며, 그룹(root)는 읽고, 쓸 수 있으며, 그리고 타인에는 아무런 권한을 주고 싶지 않다.
즉 ls ?l 로 볼 때 다음과 같은 퍼미션이 됨을 예상할 수 있다.
- |
r |
w |
- |
r |
w |
- |
- |
- |
- |
[root@lsrg mk]# chmod g+w,o-r TodayOnly.pps
즉 기존의 퍼미션에 그룹에 쓰기 권한을 추가하고, 타인권한에 읽기 권한을 제거하였다.
다음과 같이 퍼미션을 유지하면서 허가권을 수정할 수도 있다.
[root@lsrg mk]# chmod u=rw,g=rw,o= TodayOnly.pps
Case2) Case1에서 수정된 TodayOnly.pps 파일에 유저(root)는 읽고, 수정하고, 실행할 수 있으며, 그룹(root)는 쓸 수만 있고, 그리고 타인에는 읽고 실행할 권한을 주고 싶다.
즉 ls ?l 로 볼 때 다음과 같은 퍼미션이 됨을 예상할 수 있다.
- |
r |
w |
x |
- |
w |
- |
r |
- |
x |
[root@lsrg mk]# chmod u+x,g-r,o+rx TodayOnly.pps
즉 기존의 퍼미션에 유저에 실행 권한을 추가하고, 그룹에 쓰기 읽기 권한을 제거하고, 타인권한에 읽고 쓰는 권한을 추가하였다.
다음과 같이 퍼미션을 유지하면서 허가권을 수정할 수도 있다.
[root@lsrg mk]# chmod u=rwx,g=w,o=rx TodayOnly.pps
? 절대적인 방법
표 2.5 8진수 모드 값
|
유저(u) |
그룹(g) |
타인(o) |
읽기(r) |
400 |
40 |
4 |
쓰기(w) |
200 |
20 |
2 |
실행(x) |
100 |
10 |
1 |
Case 1)
- |
r |
w |
- |
r |
w |
- |
- |
- |
- |
위와 같이 퍼미션을 바꾸고 싶으면(파일명 : TodayOnly.pps)
[root@lsrg mk]# chmod 660 TodayOnly.pps
유저가 읽기 권한(400), 쓰기 권한(200), 그룹의 읽기 권한(40)과 쓰기권한(20)을 합치면 660이 된다.
하부디렉토리까지 모두 바꾸고 싶은 경우, -R옵션을 사용한다.
[root@lsrg mk]# chmod ?R 755 /home/mk/
이렇게 하면 /home/mk의 서브디렉토리를 포함한 모든 파일의 퍼미션이 755가 됨을 알 수 있다.
[참고] 4자리 퍼미션
절대적인 퍼미션 표기 방식으로 3자리 표기법을 주로 사용하는데, 4자리 표현식에 대해서도 살펴 보겠다.
비트 이름 |
절대적인 값 |
의 미 |
sticky bit |
1000 |
sticky bit은 모든 사용자가 쓸 수 있는 디렉토리에 적용되며 디렉토리에 내에 있는 파일들이 쓰기 권한이 있더라고 삭제할 수 없으며, 그 파일 또는 디렉토리의 소유자만이 삭제할 수 있다. 리눅스에서는 /tmp 와 /var/tmp 에서 볼 수 있다. 퍼미션은 drwxrwxrwt 과 같이 t가 붙어 있다. |
setgid |
2000 |
실행 권한을 소유 그룹의 권한으로 부여하며, 이 것이 파일에 적용되면 다른 그룹이 이 파일의 소유 그룹으로 실행 것과 같다. 퍼미션은 rwxr-sr-x 과 같이 s가 붙어 있다. 그외 특별한 기능이 있는데, 디렉토리에 setgid를 붙이면 디렉토리에서 생기는 파일 및 디렉토리에 setgid에 해당되는 그룹명으로 자동으로 생성된다. |
setuid |
4000 |
일반 사용자가 소유자의 권한으로 실행할 수 있도록 하며, 보안에 문제가 있을 수 있기 때문에 조심해서 사용해야 한다. 퍼미션은 drwsr-xr-x 과 같이 s가 붙어 있다. |
[참고] SetUID대한 실습
아래의 프로그램은 경실련하이텔 정보보안팀의 문병기 선생님이 작성한 예제 프로그램이다. 모두 감사의 마음으로 공부하시길 바란다.
#include main(){ FILE *fp; char filename[] = "/etc/passwd.bak"; int i; fp=fopen(filename,"r"); if (fp==NULL) printf("파일 열기에 실패했습니다.\n"); else printf("파일 열기에 성공했습니다.\n"); fclose(fp); printf("파일을 닫았습니다.\n"); fp = fopen(filename,"w"); for(i=0;i<10;i++) fprintf(fp,"%d\n",i); printf("파일 쓰기를 완료했습니다.\n"); fclose(fp);}
이 파일의 실행파일에 set uid를 붙여보자. 그러면 일반사용자가 권한이 없음에도 불구하고 passwd.bak 파일을 읽고, 저장 할 수도 있다.
[mk@lsrg mk]# gcc -o test test.c
[mk@lsrg mk]# chmod 4755 test
[mk@lsrg mk]$ ./test
- 초기 퍼미션 설정(umask)
유닉스/리눅스에서 기본적인 퍼미션을 설정할 수 있는데, 예를 들어 일반사용자가 디렉토리를 만들면 그 퍼미션은 drwxrwxr-x(775)가 되며, 파일을 만들면 -rw-rw-r--(664)이 됨을 알 수 있다.
어딘가 지정이 되어 있을 것이다. 그 지정된 값이 umask이다. 나의 umask을 알아보고 싶으면 명령 프롬프트에서 umask를 입력하면 된다.
[mk@lsrg mk]$ umask
002
이제 우리는 umask 값이 어떻게 작동하는지 자세히 살펴보겠다.
표 2.6 파일의 기본 접근 허가권
파 일 |
기본 퍼미션(허가권) |
실행할 수 없는 파일(문서 편집기) |
666 |
실행할 수 있는 파일 |
777 |
디렉토리 파일 |
777 |
기본 퍼미션 - umask = 파일 또는 디렉토리의 퍼미션 (식 1)
Case 1) umask 값이 002이라고 가정하자.
디렉토리를 초기에 만들면 디렉토리 퍼미션은 다음과 같다.
777 - 002 = 775 (drwxrwxr-x)
파일을 초기에 생성하면 파일 퍼미션은 다음과 같다.
666 - 002 = 664 (-rw-rw-r--)
Case 2) umask 값이 022이라고 가정하자.
디렉토리를 초기에 만들면 디렉토리 퍼미션은 다음과 같다.
777 - 022 = 755 (drwxr-xr-x)
파일을 초기에 생성하면 파일 퍼미션은 다음과 같다.
666 - 022 = 644 (-rw-r--r--)
리눅스 시스템내에서 어딘가에 이 umask값을 지정한 곳이 있다는 것을 독자들은 이해했을 것이다.
지정한 곳은 /etc/profile이다.
간략하게 profile을 살펴보겠다.
root@lsrg /root]# cat /etc/profile
# /etc/profile
if [ `id -gn` = `id -un` -a `id -u` -gt 14 ]; then
umask 002
else
umask 022
fi
(중략)
if문을 살펴보면 id의 그룹 이름과 유저이름이 동일하고, id의 번호가 14번 보다 큰 유저에 대해서는 umask가 002(일반사용자 해당)이 되며, 그렇지 않을 경우는 022(시스템 계정)이 됨을 알 수 있다. 따라서 시스템 계정은 일반사용자 보다 umask값이 크기 때문에 디렉토리나 파일을 만들 때 초기 퍼미션이 일반사용자 보다 적은 값을 가짐을 알 수 있다.
- 소유권 (Ownership) 설정
리눅스 시스템은 각 파일과 디렉토리에 소유자와 그룹명이 지정되어 있다. 이를 변경할 경우가 종종 발생하는데, 명령어는 chown이다.
[root@lsrg mk]# ls -l
-rw-rw---- 1 root root 541184 Sep 24 17:19 TodayOnly.pps
위의 결과를 보면 TodayOnly.pps 파일은 소유자가 root이고 그룹이 root로 되어있다.
shell> chown 소유자 파일/디렉토리
shell> chown .그룹 파일/디렉토리
shell> chown 소유자.그룹 파일/디렉토리
이를 변경하고 싶으면
[root@lsrg mk]# chown mk TodayOnly.pps
-rw-rw---- 1 mk root 541184 Sep 24 17:19 Today Only.pps
[root@lsrg mk]# chown .linux TodayOnly.pps
-rw-rw---- 1 mk linux 541184 Sep 24 17:19 Today Only.pps
위의 2명령어를 한번으로 줄일 수 있는데, 다음과 같다.
[root@lsrg mk]# chown mk.linux TodayOnly.pps
그리고 그룹만 변경하고 싶을 때는 chgrp라는 명령어가 있다.
[root@lsrg mk]# chgrp linux TodayOnly.pps
chmod와 같이 chown도 서브디렉토리까지 한꺼번에 소유자를 바꿀 수 있는 옵션이 있는데, -R옵션을 사용하면 된다.
[root@lsrg mk]# chown -R mk.linux Linux_Best/
위의 명령어는 Linux_Best가 가지고 있는 하부 디렉토리까지 소유자를 mk, 그룹을 linux로 변경하는 명령이다.
유저의 추가 및 삭제
유닉스 및 리눅스 시스템의 특징 중 하나는 다중 사용자 시스템으로서, 즉 다수의 사용자가 동시에 한 시스템을 사용할 수 있다.
시스템을 사용하기 전에 먼저 그 시스템으로부터 허가를 받아야 한다. 시스템의 허가권은 사용자명(user name)과 암호(password)로 구성된다. 사용자 명을 보통 로그인명(login name) 또는 계정(account)라고 부르는데, 리눅스가 다중 사용자 시스템이므로 사용자명은 유닉스 시스템 내에서 다수의 사용자로부터 자신을 구별하는데 사용되는 사용자 자신의 고유한 이름이다.
사용자를 생성하는 명령어는
[root@linux root]# useradd username or adduser username
예) [root@linux root]# useradd mk
그리고 서버에서 사용자 인증을 위한 패스워드를 입력한다.
[root@linux root]# passwd username
예) [root@linux root]# passwd mk
사용자의 기본적인 정보를 관리하는 곳은 /etc/passwd 파일이다.
[root@linux root]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0:sync:/sbin:/bin/sync
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
mk:x:500:500:Ahn Min Ki:/home/mk:/bin/bash
위의 패스워드 파일은 아래와 같은 필드로 구성되어 진다.
사용자이름 : 패스워드 : UID : GID : Comment : Home Directory : Shell |
1) 사용자 이름은 사용자의 이름을 적어둔다. 계정이라고 애기하는 것이다.
2) 패스워드는 보통 shadow 패스워드를 사용하기 때문에 ‘x’로 표시된다. 암호화 된 패스워드를 보고 싶으면 /etc/shadow를 살펴보면 될 것이다.
3) UID는 사용자의 고유한 ID이다. 시스템이 알아 볼 수 있는 번호로 생성되며, /etc/login.defs에서 지정한 값에 영향을 받게된다.
4) GID는 그룹의 고유한 ID이다. 시스템이 알아 볼 수 있는 번호로 생성되며, /etc/login.defs에서 지정한 값에 영향을 받게된다.
5) Comment는 사용자의 설명을 붙이는 곳이다. 보통 계정에 대한 실제 이름이나 전화번호 등을 붙인다. 공백으로 남기는 경우도 종종있다.
6) 사용자가 사용하는 셀을 지정하는데, POP3 계정 또는 셀이 필요없는 계정(ftp, apache, named)에 대해서 /bin/false로 지정하여 셀을 사용할 수 없게 할 수 있다.
[참고] passwd 파일에 대해
CASE 1) /bin/false
[root@localhost /root]# tail -1 /etc/passwd
pk:x:502:502::/home/pk:/bin/false
< telnet 접속 >
[root@localhost /root]# telnet localhost
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
WOWLiNUX Release 7.1 (Paran)
Kernel 2.4.2-2wl on an i686
login: pk
Password:
Last login: Tue Feb 5 09:52:42 from localhost
Connection closed by foreign host. /* 접속 실패 */
< FTP 접속 >
[root@localhost /root]# ftp localhost
Connected to localhost.localdomain.
220 BCB1COOL Server (Proftpd FTP Server) [localhost.localdomain]
Name (localhost:mk): pk
331 Password required for pk.
Password:
530 Login incorrect.
Login failed.. /* 접속 실패 */
ftp>
CASE 2) /dev/null
[root@localhost /root]# tail -1 /etc/passwd
pk:x:502:502::/home/pk:/dev/null
< telnet 접속>
[root@localhost /root]# telnet localhost
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
WOWLiNUX Release 7.1 (Paran)
Kernel 2.4.2-2wl on an i686
login: pk
Password:
Last login: Tue Feb 5 09:59:46 from localhost
login: no shell: Permission denied. /* 접속 실패 */
Connection closed by foreign host.
< FTP 접속 >
[root@localhost /root]# ftp localhost
Connected to localhost.localdomain.
220 BCB1COOL Server (Proftpd FTP Server) [localhost.localdomain]
Name (localhost:mk): pk
331 Password required for pk.
Password:
530 Login incorrect.
Login failed.. /* 접속 실패 */
ftp>
CASE 3) 빈 필드
[root@localhost /root]# tail -1 /etc/passwd
pk:x:502:502::/home/pk:
< telnet 접속>
[root@www /root]# telnet localhost
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
WOWLiNUX Release 7.1 (Paran)
Kernel 2.4.2-2wl on an i686
login: pk
Password:
Last login: Thu Mar 7 10:58:20 from 211.169.117.45
sh-2.04$ ls /* 쉘은 쓸 수 있지만, bash의 설정을 불러올 수 없다. */
firewall.sh jakarta-tomcat-3.2.4.tar.gz oracle_down rpms test
< FTP 접속 >
[root@localhost /root]# ftp localhost
Connected to localhost.localdomain.
220 BCB1COOL Server (Proftpd FTP Server) [localhost.localdomain]
Name (localhost:mk): pk
331 Password required for pk.
Password:
530 Login incorrect.
Login failed.. /* 접속 실패 */
ftp>
- 사용자 생성 설명
[root@lsrg /root]# useradd
usage: useradd [-u uid [-o]] [-g group] [-G group,...]
[-d home] [-s shell] [-c comment] [-m [-k template]]
[-f inactive] [-e expire ] [-p passwd] [-n] [-r] name
useradd -D [-g group] [-b base] [-s shell]
[-f inactive] [-e expire ]
-u |
유저의 UID 번호를 지정한다. |
-g |
기존에 존재하는 그룹에 대한 그룹명이나 GID 번호를 입력한다. |
-G |
복수개의 그룹을 지정할 때 사용한다. 예를 들면 ?G 10, 20, 30이라 하면 GID가 10, 20, 30과 같은 그룹으로 지정한다. |
-d |
유저의 홈디렉토리를 지정한다. 예) /home2/mk |
-s |
셀 종류를 입력한다. 예를 bash, sh, csh, ksh |
-c |
유저의 커멘트를 추가할 수 있다. |
-m |
사용자의 홈디렉토리가 없는 경우 생성을 한다. 만약 ?k 옵션과 같이 사용한다면 ?k 뒤에 그 사용자의 홈디렉토리에 생성할 환경파일이 있는 디렉토리를 지정할 수 있다. 기본적으로 /etc/skel 디렉토리에서 복사를 해 온다. |
-f |
뒤에 지정한 수는 앞으로 이 계정이 유효하지 않게 될 날짜를 의미한다. 예를 들면 ?f 40이라고 지정하면 앞으로 40일 뒤에 이 계정은 영원히 사용할 수 없게 되는 것이다. |
-e |
관리자가 지정한 날짜까지만 계정이 유효하도록 한다. 형식은 YYYY-MM-DD로 지정한다. |
-p |
암호화된(crypt) 암호를 입력한다. 잘 사용하지 않는다. |
위의 옵션을 적절히 사용하여 사용자를 한번 만들어 보겠다. 시험에 자주 출제되는 문제 중에 하나이다.
[root@lsrg /root]# useradd ?u 500 ?G 11,12,13 ?d /home/mk ?s /bin/sh ?e 2005-02-27 mk
[root@lsrg /root]# passwd mk
사용자를 만들기 위해 위의 같은 긴 명령어를 사용하지는 않는다. 간단하게 사용자를 만들기만 하면 되는데, 그 이유는 이미 설정되어 있기 때문이다.
[root@lsrg /home]# useradd ?D
GROUP=100 //기본 그룹 ID
HOME=/home //홈디렉토리는 /home에 생성된다.
INACTIVE=-1 //password가 만기된 뒤 계정 사용이 불가능하게 되는 날수 지정하는 것으로서 0인 경우 password가 만기되자마자 계정 사용이 불가능하게 됨(-1일 경우 지정 되어 있지 않음)
EXPIRE= //password 만기 일수 지정(Expire는 지정되어 있지 않음)
SHELL=/bin/bash //사용자 셀은 bash를 사용함
SKEL=/etc/skel //사용자 홈디렉토리를 만들 때 복사하는 디렉토리
설정을 바꾸고 싶으면 아래의 옵션을 이용하면 된다.
useradd -D [-g group] [-b base] [-s shell]
[-f inactive] [-e expire ]
예를 들어 홈디렉토리를 바꾸고 싶을 때 다음과 같이 지정하면 된다.
[root@lsrg /home]# useradd ?D ?d /home2
그런데, useradd ?D 옵션을 치면 화면에 보여주는 결과는 실제로는 아래의 설정파일에서 불러오는 것을 알 수 있다. 따라서 아래의 파일을 수정해도 되겠다. 하지만 주의해야 한다.
[root@www /root]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
SKEL이라고 지정된 곳이 있는데, /etc/skel 디렉토리에 어떤 파일 또는 디렉토리를 생성시키면 사용자를 만들 때 자동으로 생성되는 것을 알 수 있다. 즉 사용자를 생성시킬 때 사용자의 홈디렉토리를 생성할 때 이 디렉토리(/etc/skel)를 복사하는 것이다.
사용자를 삭제할 때는 userdel 이라는 명령어를 사용한다.
[root@lsrg /root]# userdel mk
[root@lsrg /root]# rm ?rf /home/mk
또는
[root@lsrg /root]# userdel ?r mk
위의 ?r 옵션은 홈디렉토리까지 모두 삭제되므로, 주의하여야 한다. 왜냐하면 회사를 퇴사했다고 무조건 홈디렉토리까지 함부로 삭제해서는 안된다. 일단 회사를 그만 두었을 경우, 접속을 할 수 없게 만드는 것은 당연하지만, 홈디렉토리에 그 사용자의 개인적인 파일이 있을 수 있다. 사용자 홈디렉토리를 삭제하기 전에 반드시 백업을 받아 퇴사한 사용자에게 E-mail로 보내주거나 다른 방식으로 전달해야 한다. 이렇게 강조를 하는 이유는 필자도 회사를 퇴사하면서 홈디렉토리가 모두 한 순간에 날아간 경험이 있기 때문이다. 그 서버관리자가 아쉬워서 전 담당자인 나에게 서버에 관해 여러 가지 물어봤을 때 매정하게 대했던 생각이 난다. 나의 소심함인가? J
[참고] password 없는 사용자 만들기
[root@localhost /root]#useradd ring
[root@localhost /root]#vi /etc/shadow
ring:!!:11701:0:99999:7::: -> 이부분에서 !!를 없애서 공백도 없이 만든다.
이렇게 하면 pw가 없는 사용자계정을 만들 수 있다.
테스트 하기
[root@linux /root]# telnet localhost
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
WOWLiNUX Release 7.1 (Paran)
Kernel 2.4.13 on an i686
login: ring
Last login: Sun Jan 20 21:41:58 from 211.217.75.208
[mk@linux mk]$
패스워드 입력 항목이 없이 바로 계정만으로 로그인이 됨을 알 수 있다.
- Shadow (쉐도우)
암호화 된 패스워드를 예전에는 모든 사용자가 볼 수 있는 /etc/passwd에 넣어 두었다. 암호화 된 암호는 역 변환이 불가능하다는 이유로 모두 볼 수 있었다. 하지만 리눅스 보안에서 언급하겠지만, 패스워드가 쉽게 알 수 있는 숫자 또는 사전 단어일 때 사전공격(Dictionary Attack)으로 패스워드를 알 수 있다. 이 사전공격이란 순차적으로 사전에 있는 단어를 하나씩 대입하여 암호화된 암호와 같은지 비교하는 공격으로, 좋은 사전과 충분히 훌륭한 시스템에서는 5분 ~ 10분에 많은 사용자의 암호를 찾아 낼 수 있을 것이다. 요즘 인터넷을 통해 웹스터(Webster) 사전과 저가의 팬티엄 시스템의 보급으로 인해 짧은 시간 내에 패스워드를 알아 낼 수 있다. 참고로 호주 원주민 사전 파일도 있다는 사실을 기억하기 바란다.
결론은 암호화된 암호를 일반사용자는 볼 수 없게 하고, 오직 수퍼유저(root)만이 볼 수 있게 관리하게 해주는 것이 shadow 패키지이다.
username : passwd : resentchpass : rotate : currentpass : warn : expire : disable : reserved |
1. 사용자 계정
2. 암호화 된 암호
3. 1970년 1월 1일부터 최근에 패스워드를 변경한 날짜까지 계산한 수
4. 패스워드 변경시기까지 남은 날수(0)
5. 반드시 패스워드를 바꾸어야 할 때 까지 남은 날 수(99999)
6. 패스워드가 만료되기 전에 사용자에게 미리 경고하는 시간(7)
7. 패스워드가 expire된 뒤에 사용자의 계정이 사용되지 못하게 될 때 까지 남은날(-1)
8. 계정 사용이 불가능하게 될 날(11512)
9. 예약되어짐
shadow 유틸리티
pwchk : /etc/passwd와 /etc/shadow간의 정보가 일치하는 지 검사
pwconv : /etc/passwd의 내용을 shadow 파일에 추가한다.
pwunconv : pwconv의 역이라고 생각하면 된다.
- Login.defs
로그인 할 대 참조하는 파일로써 위에서 설명한 useradd에서 만약 홈디렉토리가 지정이 안되어 있을 때 이 파일에 지정이 되어 있는가의 여부를 본다고 한적이 있다.
그룹의 추가 및 삭제
그룹(Group)은 무엇인가? 그룹이란 여러 사용자를 하나의 집단으로 구분하는 것을 말한다. 많은 사용자를 효율적으로 관리할 수 있기 때문이다.
- 그룹 생성
[root@lsrg /root]# groupadd linux
[root@lsrg /root]# cat /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
mk:x:500:
yoonsup:x:501:
linux:x:502
/etc/group 이라는 파일에 linux라는 그룹이 생성되었으며, 502는 linux의 GID(그룹의 고유한 숫자)임을 알 수 있다.
- 그룹 삭제
[root@lsrg /root]# groupdel linux
- 그룹 묶기
1) 그룹을 묶는 방법은 여러 가지가 있을 수 있지만, 여기서는 /etc/group 파일을 수정하는 방법을 살펴보겠다.
[root@lsrg /root]# vi /etc/group
linux:x:505:mk,thomas,yoonsup
즉 linux라는 그룹에 mk, thomas와 yoonsup을 추가하기만 하면 같은 그룹에 묶인다.
다른 방법으로는 간단히 usermod라는 명령어를 사용하면 된다.
[root@lsrg /root]# usermod ?G linux mk
즉 mk라는 사용자를 linux라는 그룹에 묶는 명령이다.
2) 공유할 디렉토리 퍼미션 및 그룹 조정
같은 그룹으로 묶인 사용자가 어떤 디렉토리를 공유하게 하려면, 그 디렉토리의 퍼미션(permission)과 그룹 소유자를 조정해줘야 한다.
일반적으로 사용자를 생성하면 /home 밑에 생성된다. 이 홈 디렉토리를 공유하고 싶으면, 각각의 홈 디렉토리의 그룹에 대한 퍼미션과 그룹명을 변경시켜야 같은 그룹으로 묶인 사용자들이 파일에 접근할 수 있다.
만약 mk와 pk라는 계정이 있고, linux라는 그룹으로 묶여 있다고 가정하자.
예)
[root@lsrg /root]# cd /home
[root@lsrg /home]# chown mk.linux mk/
[root@lsrg /home]# chown pk.linux pk/
[root@lsrg /home]# chmod 2750 mk/
[root@lsrg /home]# chmod 2750 pk/
2750를 준 것은 앞의 2는 set group id bit 또는 setgid bit라 부르며, 그룹의 일원(member)이 디렉토리 또는 파일 생성시킬 때 파일 또는 디렉토리의 그룹을 자동으로 linux로 변경한다.
각각의 디렉토리에 그룹명을 linux로 변경하였으며, 퍼미션은 750(rwxr-x---)로 설정하였다. 즉 타인(같은 그룹에 있지 않은 사용자)에 대해서는 접근할 수 없도록 설정하였다.
따라서 mk가 로긴해서 pk의 디렉토리에 들어 갈 수 있으며, 파일을 복사할 수 있다. pk도 마찬가지다. mk로 로긴해서 프롬프트에서 groups라는 명령어를 치면, 자신이 어떤 그룹인지를 알 수 있다.
[mk@lsrg mk]$ groups
mk linux
만약 위의 퍼미션과 Ownership이 잘 못되었다면, Permission Denied라는 에러 문구를 볼 수 있을 것이다