#############################################
## 주제 : 사용자와 그룹 ##
#############################################
o 사용자의 종류
슈퍼유저(관리자) : 로그인 O, 시스템을 관리하는 사용자 (uid 0)
시스템유저 : 로그인 X, 데몬이나 특정 프로그램을 실행하는 사용자 (uid 1 ~ 100)
일반유저 : 로그인 O, 자신의 디렉토리에 자료를 관리하는 사용자 (uid 500 ~ 65534)
Linux 관리자 계정: root root
Windows 관리자 계정: administrator administrators
시스템유저 : root 가 생성하지 않아도 설치시에 이미 만들어져 있다.
일반유저 : root 가 반드시 만들어야 한다.
사용자마다 번호를 부여받는다 : UID (유저아이디라고 읽는다.)
로그인 여부 : /bin/false , /sbin/nologin X
로그인 여부 : /bin/bash, /bin/sh, /bin/ksh, /bin/csh O
로그인 여부는 /etc/passwd 의 마지막 필드에 정의되어 있다.
o 사용자를 생성하면
/etc/passwd, /etc/group, /etc/shadow 파일이 업데이트된다.
o 관련 파일들
- 리눅스에 존재하는 모든 사용자들은 반드시 하나 이상의 그룹에 포함되어 있다.
/etc/passwd : 사용자의 정보가 담겨있는 파일
/etc/group : 그룹의 정보가 담겨있는 파일
/etc/shadow : 사용자의 비밀번호 정보가 담겨있는 파일
/etc/passwd- : 사용자의 정보가 담겨있는 이전 passwd 파일 (백업용)
/etc/group- : 그룹의 정보가 담겨있는 이전 group 파일 (백업용)
/etc/shadow- : 사용자의 비밀번호 정보가 담겨있는 이전 shadow 파일 (백업용)
/etc/shells : 쉘의 종류가 있는 파일
/etc/default/useradd : 사용자를 생성할 때 사용하게 되는 기본정보가 있는 파일
/etc/login.defs : 사용자를 생성할 때 기본값이 저장되어 있는 파일 (설정파일)
- MAIL_DIR : 메일을 받을 디렉토리
- PASS_MAX_DAYS : 패스워드 변경없이 사용할 수 있는 최대일자
- PASS_MIN_DAYS : 패스워드 변경없이 사용할 수 있는 최소일자
- PASS_MIN_LEN : 패스워드의 최소 바이트 수
- PASS_WARN_AGE
- UID_MIN : 생성할 수 있는 UID 시작번호
- UID_MAX : 생성할 수 있는 최대 GID 번호
- GID_MIN : 새로 생성되는 그룹의 GID 시작번호
- GID_MAX : 새로 생성되는 그룹에서 지정 할 수 있는 최대 GID번호
- CREATE_HOME : 홈디렉토리 생성 여부
/etc/skel : 뼈대 디렉토리로 사용자를 생성할 때 이 디렉토리의 모든 파일들을 복사
- 리눅스 시스템 프로그래밍을 하기 위해서 필요한 파일들
/etc/passwd에 대한 구조가 담겨있는 파일 : /usr/include/pwd.h 에서 passwd 구조체 참고
/etc/group에 대한 구조가 담겨있는 파일 : /usr/include/grp.h 에서 group 구조체 참고
/etc/shadow에 대한 구조가 담겨있는 파일 : /usr/include/shadow.h 파일에서 spwd 구조체 참고
o rpm 으로 관련 명령어 알아보기
# which useradd
/usr/sbin/useradd
# rpm -qf /usr/sbin/useradd
shadow-utils-4.0.17-20.el5
# rpm -qi shadow-utils
# rpm -ql shadow-utils | grep bin
# rpm -qc shadow-utils
# rpm -qd shadow-utils
o 사용자관련 명령어
디렉토리 : /usr/bin
chage faillog gpasswd lastlog newgrp sg
디렉토리 : /usr/sbin
adduser chpasswd groupadd groupdel groupmod grpck grpconv grpunconv
newusers pwck pwconv pwunconv useradd userdel usermod
###########################
## /etc/passwd 파일 구조 ##
###########################
- 발음 : 패스워드
- 각 필드의 구분자는 : 으로 구분되어 있다.
username:password:uid:gid:comment:homedirectory:shell
1 2 3 4 5 6 7
1. 사용자 이름 (OS가 사용자에게 부여한 계정명)
2. 암호화된 비밀번호 (현재는 사용하지 않고 단순 x 문자가 들어있다.)
3. 사용자의 UID (OS 가 사용자에게 부여한 번호)
4. 사용자의 GID (기본그룹 : main그룹, OS가 사용자가 속한 그룹에 부여한 번호)
5. 설명문 (사용자에 대한 기본 정보를 넣는다.)
6. 사용자의 홈디렉토리 (자신만의 공간)
7. 실행할 프로그램 (일반적으로 사용자의 로그인 쉘이 저장된다.)
e.g.) /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
##########################
## /etc/group 파일 구조 ##
##########################
- 각 필드의 구분자는 : 으로 구분되어 있다.
groupname:password:gid:members
1 2 3 4
1. 그룹명
2. 그룹 비밀번호 (단순히 x 문자가 있고 /etc/gshadow 에 비번이 담겨있다.)
3. 그룹 번호 GID ( 기본그룹의 번호 )
4. 그룹 멤버리스트 (여러 멤버가 존재할 때 , 로 구분한다.)
e.g.) /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5:
disk:x:6:root
lp:x:7:daemon,lp
mem:x:8:
kmem:x:9:
- 기억해야할 그룹
root, wheel, users
root : 슈퍼유저 root가 속해있는 그룹
wheel : 관리자 권한을 가진 그룹
users : 일반 유저의 권한을 가진 그룹
- 3개의 그룹을 egrep 으로 출력한다.
# egrep '^root|wheel|users' /etc/group
root:x:0:root
wheel:x:10:root
users:x:100:
# cat /etc/group | egrep '^root|wheel|users'
root:x:0:root
wheel:x:10:root
users:x:100:
###########################
## /etc/shadow 파일 구조 ##
###########################
- 각 필드의 구분자는 : 으로 구분되어 있다.
- username:password:lastchange:mindays:maxdays:warndays:inactive:expire:flag
1 2 3 4 5 6 7 8 9
1. 사용자명 ***
2. 암호화된 비밀번호 ***
3. lastchange : 최근 비밀번호 변경일 (1970년 1월 1일 0시 0분 0초 기준의 날짜 수 : timestamp)
4. mindays : 비밀번호 변경 후, 재설정을 위한 대기일 수
5. maxdays : 비밀번호 유효기간 ***
6. warndays : 비밀번호 변경 경고 시간
7. inactive : 비밀번호 유효 기간 (5일이면, 5일에 한번은 들어가야 된다.)
8. expire : 비밀번호 만료 기간 이후 계정을 사용할 수 없게 되는 기간
9. flag : 예약으로 세팅되어 있고 현재는 사용되지 않는다.
e.g.) /etc/shadow
# head -5 /etc/shadow
root:$1$TDIRqvvY$jZWHAuWVqrxtWYhl33QUq/:16542:0:99999:7:::
bin:*:16512:0:99999:7:::
daemon:*:16512:0:99999:7:::
adm:*:16512:0:99999:7:::
lp:*:16512:0:99999:7:::
- 왼쪽의 프로세스의 출력을 파이프를 통해서 오른쪽 프로세스의 입력으로
들어간다.
# cat /etc/shadow | head -5
root:$1$TDIRqvvY$jZWHAuWVqrxtWYhl33QUq/:16542:0:99999:7:::
bin:*:16512:0:99999:7:::
daemon:*:16512:0:99999:7:::
adm:*:16512:0:99999:7:::
lp:*:16512:0:99999:7:::
o 비밀번호 변경
- 아래 사용자는 비밀번호가 막혀있는(lock) 사용자를 의미한다.
testuser2:!!:16626:0:99999:7:::
~~
# passwd -d testuser2
Removing password for user testuser2.
passwd: Success
# tail -1 /etc/shadow
- 아래 사용자는 비밀번호가 없는 사용자를 의미한다.
testuser2::16626:0:99999:7:::
~~
# passwd testuser2
Changing password for user testuser2.
New UNIX password: <-- 비번은 보이지 않는다.
Retype new UNIX password: <-- 비번은 보이지 않는다.
passwd: all authentication tokens updated successfully.
- 아래 사용자는 비밀번호가 있는 사용자를 의미한다.
# grep testuser2 /etc/shadow
testuser2:$1$l.6b5XGD$euIvSXsvAGAqf6FKU8Irj1:16626:0:99999:7:::
o 비밀번호 알고리즘을 변경하는 방법
- 비밀번호는 5.x 까지는 md5로 설정되어 있고 CentOS 6.5 는 sha512로 설정되어 있다.
- md5 알고리즘은 약하고 sha512는 강력하다는 특징이 있다. 따라서 5.x 로 설치했다면
authconfig 명령어로 암호 알고리즘을 변경해주면 좋다.
authconfig --passalgo=md5 --update username:$1$salt$.....:
authconfig --passalgo=sha256 --update username:$5$salt$.....:
authconfig --passalgo=sha512 --update username:$6$salt$.....:
o 레드햇계열의 배포판에서 사용되는 사용자 목록이 담겨있는 파일
# vi /usr/share/doc/setup-2.5.58/uidgid
:
:
NAME UID GID HOME SHELL PACKAGES
:
:
nobody 99 99 / /sbin/nologin setup
apache 48 48 /var/www /bin/false apache
mysql 27 27 /var/lib/mysql /bin/bash mysql
:
:
o 사용자의 홈디렉토리
- 사용자의 홈디렉토리는 사용자가 시스템에 로그인을 사용하는 공간이다.
- 관리자가 사용자를 생성하면 시스템에 일반 사용자가 자료를 저장할 수 있는
공간이 생성된다.
- 특히 시스템에서는 오직 root(UID 0)만이 일반 사용자를 생성할 수 있다.
o 사용자의 홈디렉토리 경로
- 관리자의 홈디렉토리 경로 : /root
- 일반유저의 홈디렉토리 경로 : /home/사용자명
사용자의 홈디렉토리가 /home 디렉토리에 위치하는 것은 아니고 다른 디렉토리에
위치할 수 있다. e.g.) /home1/ksw
사용자의 디렉토리를 /home 이 아닌 다른 디렉토리에 위치시키는 이유
- 사용자의 디렉토리 공간이 풀이 났을 때
o 사용자의 디렉토리를 이동하는 방법
- 사용자의 홈 디렉토리는 ~ 문자를 이용해서 이동한다.
root : /root
linux : /home/linux
unix : /home/unix
windows : /home/windows
freebsd : /home1/freebsd
# cd /home/linux O
# cd /home/freebsd X
# cd /home1/freebsd O
# cd ~linux O
# cd ~freebsd O
==============================================================================
LAB> 사용자를 생성하고 확인해보자.
Usage: useradd [options] LOGIN
!!! 기본값은 UID, GID 이전 사용자의 다음 번호로 부여받는다. !!!
!!! 이 부분의 기본값은 옵션을 변경함으로써 변경할 수 있다. !!!
- 사용자를 생성한다.
# useradd user1
# useradd user2
# useradd user3
- 생성된 사용자를 /etc/passwd 파일에서 검색한다.
# alias grep='grep --color'
# grep ^user /etc/passwd
user1:x:500:500::/home/user1:/bin/bash
user2:x:501:501::/home/user2:/bin/bash
user3:x:502:502::/home/user3:/bin/bash
- 생성된 사용자를 /etc/passwd, /etc/group, /etc/shadow 파일에서 동시에
검색한다.
# grep ^user[1-3] /etc/{passwd,group,shadow}
/etc/passwd:user1:x:500:500::/home/user1:/bin/bash
/etc/passwd:user2:x:501:501::/home/user2:/bin/bash
/etc/passwd:user3:x:502:502::/home/user3:/bin/bash
/etc/group:user1:x:500:
/etc/group:user2:x:501:
/etc/group:user3:x:502:
/etc/shadow:user1:!!:16682:0:99999:7:::
/etc/shadow:user2:!!:16682:0:99999:7:::
/etc/shadow:user3:!!:16682:0:99999:7:::
==============================================================================
==============================================================================
LAB> 사용자를 삭제하고 확인해보자.
Usage: userdel [options] LOGIN
-r, --remove remove home directory and mail spool
-- 삭제 조건 --
1. user1 : 몽땅 삭제
2. user2 : 몽땅 삭제
3. user3 : home directory & mail spool 은 남겨두고 삭제
-- 삭제 조건 --
- -r 옵션을 주고 삭제한다.
-r 옵션은 user1, user2 는 홈디렉토리, mail spool 파일까지 삭제된다.
# userdel -r user1
# userdel -r user2
- -r 옵션 생략하고 삭제한다.
-r 옵션을 생략하고 삭제하면 홈디렉토리, mail spool 파일은 남아있게 된다.
# userdel user3
- 홈디렉토리가 남아있는 것을 확인한다.
# ls /home
user3
- mail spool 파일도 남아있는 것을 확인한다.
# ls -l /var/spool/mail
total 20
:
-rw-rw---- 1 502 mail 0 Sep 4 22:16 user3
- 만약 홈디렉토리를 삭제하고자 할 때는 rm 명령어로 개별적으로
user3 사용자의 홈디렉토리를 삭제한다.
# rm -rf /home/user3
- mail spool 파일도 삭제하고자 할 때는 rm 명령어로 개별적으로
삭제한다. mail spool 파일은 메일을 받을 수 있는 파일이다.
# rm -fv /var/spool/mail/user3
==============================================================================
==============================================================================
LAB> 사용자를 생성하고 삭제해보자.
useradd,adduser : 사용자를 생성하는 명령어
userdel : 사용자를 삭제하는 명령어
/etc/passwd : 사용자의 정보가 들어있는 DB (text 형태로 저장)
/etc/shadow : 사용자의 정보가 들어있는 DB (text 형태로 저장)
/etc/group : 그룹에 대한 정보가 들어있는 DB (text 형태로 저장)
Usage: useradd [options] LOGIN
options : -r (홈디렉토리를 삭제한다.)
!!! 사용자 생성시 /etc/passwd, /etc/group, /etc/shadow 파일에 한 줄이 추가된다 !!!
!!! 사용자 삭제시 /etc/passwd, /etc/group, /etc/shadow 파일에 한 줄이 삭제된다 !!!
- 3명의 사용자를 생성하고 정보를 확인한다.
# useradd linux
# useradd unix
# useradd windows
# tail -3 /etc/passwd
# tail -3 /etc/group
# tail -3 /etc/shadow
- 3명의 사용자를 삭제하고 정보를 확인한다.
# userdel -r linux
# userdel -r unix
# userdel -r windows
# tail -3 /etc/passwd
# tail -3 /etc/group
# tail -3 /etc/shadow
==============================================================================
==============================================================================
LAB> 사용자를 생성하고 로그인을 시켜보자.
- user1 사용자를 생성한다.
# useradd user1
# tail -1 /etc/passwd
user1:x:500:500::/home/user1:/bin/bash
# tail -1 /etc/shadow
user1:!!:16682:0:99999:7:::
# passwd user1
Changing password for user user1.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
# tail -1 /etc/shadow
user1:$1$TAXID/dw$tr72OfoXRTLFErmK0FdOl1:16682:0:99999:7:::
# ssh user1@localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
RSA key fingerprint is 2f:16:00:24:97:4f:b5:b4:99:d4:f3:08:85:48:80:cf.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
user1@localhost's password:
$ id
uid=500(user1) gid=500(user1) groups=500(user1) context=user_u:system_r:unconfined_t
==============================================================================
==============================================================================
LAB> 아래 조건에 해당하는 사용자를 생성하고 비밀번호를 부여한 후
시스템에 로그인 시키시오.
-- 조건 --
---------+--------------
사용자명 | 비밀번호
---------+--------------
user2 | korea^^
---------+--------------
user3 | linux^^
---------+--------------
-- 조건 --
# useradd user2
# useradd user3
# passwd user2
# passwd user3
# ssh user2@localhost
# ssh user3@localhost
==============================================================================
==============================================================================
LAB> user4 사용자의 쉘을 top 으로 변경해서 생성해보자.
# useradd user4
# userdel -r user4
# useradd -s /usr/bin/top user4
# tail -1 /etc/passwd
user4:x:503:503::/home/user4:/usr/bin/top
# passwd user4
Changing password for user user4.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
# ssh user4@localhost
user4로 로그인 후 top이 실행된다.
==============================================================================
==============================================================================
LAB> 사용자에게 메일 보내기
# /etc/init.d/sendmail start
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]
[root@localhost ~]# ls -l /var/spool/mail/user1
-rw-rw---- 1 user1 mail 0 Sep 4 23:11 /var/spool/mail/user1
[root@localhost ~]# mail user1
Subject: Hello
Hi ^^*
.
Cc:
[root@localhost ~]# ls -l /var/spool/mail/user1
-rw-rw---- 1 user1 mail 650 Sep 5 00:59 /var/spool/mail/user1
==============================================================================
==============================================================================
LAB> 사용자 홈디렉토리 변경하기
# mkdir /home1
# useradd -D -b /home1
# useradd user100
# ls /home1
user100
# grep user100 /etc/passwd
user100:x:504:504::/home1/user100:/bin/bash
# ls /home1
user100
# userdel -r user100
# useradd -D -b /home
==============================================================================
============================================================================
LAB> md5 알고리즘을 sha512 로 변경하기
# authconfig --passalgo=sha512 --update
# grep ^root /etc/shadow
root:$1$NbYqO/vr$VAti5rjkpasKwPK5DIXLg1:16681:0:99999:7:::
# passwd
Changing password for user root.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
# grep ^root /etc/shadow
root:$6$YMrkwzHL$LPGnz41DTA8loXoYrJ0cTZaCHH0WVnoVwSnBl.CWbfCrvH4Z1/VGO52FB4b/Op7SVMBIB8DI9sh8Jgs47do9X/:16682:0:99999:7:::
============================================================================
============================================================================
LAB> 다양한 옵션을 이용해서 사용자를 생성하자.
!!! 사용자를 생성할 때 반드시 그룹이 먼지 만들어져 있어야 한다. !!!
# groupadd -g 8000 testgroup
# useradd -u 5000 -g 8000 -c testuser -d /tmp/testuser -s /bin/csh testuser
# tail -1 /etc/passwd
testuser:x:5000:8000:testuser:/tmp/testuser:/bin/csh
# tail -1 /etc/group
testgroup:x:8000:
- userdel 로 사용자를 삭제해도 그룹은 지워지지 않는다.
이때는 groupdel 로 그룹을 삭제해야 한다.
# userdel -r testuser
# tail -1 /etc/passwd
user5:x:504:504::/home/user5:/bin/bash
# tail -1 /etc/group
testgroup:x:8000:
# groupdel testgroup
# tail -1 /etc/group
user5:x:504:
============================================================================
-------- 여기까지 --------
==============================================================================
LAB> 현재 Linux Box (현재 시스템) 에 사용자와 그룹의 개수를 확인해보자.
-- wc 연습하기 --
# wc /etc/passwd
38 64 1802 /etc/passwd
# echo 1234 > a.txt
# ls -l a.txt
---------- 1 root root 5 Apr 24 12:53 a.txt
# wc a.txt
1 1 5 a.txt
# echo 5678 >> a.txt
# ls -l a.txt
---------- 1 root root 10 Apr 24 12:53 a.txt
# wc a.txt
2 2 10 a.txt
# echo 0000 1111 >> a.txt
# ls -l a.txt
---------- 1 root root 20 Apr 24 12:54 a.txt
# wc a.txt
3 4 20 a.txt
# cat a.txt
1234
5678
0000 1111
# wc -l a.txt
3 a.txt
-- wc 연습하기 --
- Linux Box 에 38명의 사용자가 있는 것을 알 수 있다.
# wc -l /etc/passwd
38 /etc/passwd
# cat /etc/passwd | wc -l
38
- Linux Box 에 54개의 그룹이 있는 것을 알 수 있다.
# wc -l /etc/group
54 /etc/group
==============================================================================
==============================================================================
LAB> 슈퍼유저 root 의 정보를 확인해보자.
# alias grep='grep --color'
# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
# awk /^root/ /etc/shadow
root:$1$e5ngkd97$VHmsVHxJ0W9WZgld/xXdX.:15959:0:99999:7:::
# head -1 /etc/group
root:x:0:root
==============================================================================
==============================================================================
LAB> useradd의 다양한 옵션을 이용해서 사용자를 생성해보자.
형식 :
# useradd
Usage: useradd [options] LOGIN
# LANG=C
# groupadd -g 507 user2
# groupdel user2
- 사용자를 처음 생성하면 자동으로 UID : 500 GID : 500 으로 생성된다.
- 그 다음 사용자를 생성하면 /etc/passwd 마지막 사용자 다음번호로 UID가 부여된다.
- GID UID를 따른다.
- 참고로 다른 UNIX, LINUX 에서는 다를 수 있다.
# useradd -u 507 user2
# grep user2 /etc/{passwd,shadow,group}
/etc/passwd:user2:x:507:507::/home/user2:/bin/bash
/etc/shadow:user2:!!:15959:0:99999:7:::
/etc/group:user2:x:507:
# useradd user3
# grep user3 /etc/{passwd,shadow,group}
/etc/passwd:user3:x:508:508::/home/user3:/bin/bash
/etc/shadow:user3:!!:15959:0:99999:7:::
/etc/group:user3:x:508:
- /etc/passwd 필드의 옵션을 부여해서 사용자를 생성한다.
- username:password:uid:gid:comment:homedirectory:shell
- user4:x:5000:5000:testuser:/home/linuxuser4:/bin/sh
- -u -g -c -d -s
# groupadd -g 5000 user4
# useradd -u 5000 -g 5000 -c testuser -d /home/linuxuser4 -s /bin/sh user4
# grep user4 /etc/{passwd,shadow,group}
/etc/passwd:user4:x:5000:5000:testuser:/home/linuxuser4:/bin/sh
/etc/shadow:user4:!!:15959:0:99999:7:::
/etc/group:user4:x:5000:
# grep user4 /etc/shadow
user4:!!:15959:0:99999:7:::
# LANG=ko_KR.eucKR
# chage -l user4
마지막으로 열쇠글을 바꾼 날 : 4월 24, 2015
열쇠글 만료 :안함
열쇠글이 비활성화 기간 :안함
계정 만료 :안함
열쇠글을 바꿀 수 있는 최소 날 수 : 0
열쇠글을 바꿔야 하는 최대 날 수 : 99999
열쇠글 만료 예고를 하는 날 수 : 7
LANG=C
# chage -l user4
Last password change : Sep 11, 2013
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
# chage user4
Changing the aging information for user4
Enter the new value, or press ENTER for the default
Minimum Password Age [0]: 1
Maximum Password Age [99999]: 30
Last Password Change (YYYY-MM-DD) [2013-09-11]: 2015-05-20
Password Expiration Warning [7]: 5
Password Inactive [-1]: 20
Account Expiration Date (YYYY-MM-DD) [1969-12-31]: 2015-09-30
- 바뀐 정보를 볼 수 있지만 비밀번호는 아직 없다.
# grep user4 /etc/shadow
user4:!!:16575:1:30:5:20:16708:
# chage -l user4
마지막으로 열쇠글을 바꾼 날 : 5월 20, 2015
열쇠글 만료 : 6월 19, 2015
열쇠글이 비활성화 기간 : 7월 09, 2015
계정 만료 : 9월 30, 2015
열쇠글을 바꿀 수 있는 최소 날 수 : 1
열쇠글을 바꿔야 하는 최대 날 수 : 30
열쇠글 만료 예고를 하는 날 수 : 5
# passwd --stdin user4
Changing password for user user4.
12345
passwd: all authentication tokens updated successfully.
# grep user4 /etc/shadow
user4:$1$9iw1g.9x$MkwNjI9Icanzq.Y7NV4gF/:16549:1:30:5:20:16708:
# chage -l user4
마지막으로 열쇠글을 바꾼 날 : 4월 24, 2015
열쇠글 만료 : 5월 24, 2015
열쇠글이 비활성화 기간 : 6월 13, 2015
계정 만료 : 9월 30, 2015
열쇠글을 바꿀 수 있는 최소 날 수 : 1
열쇠글을 바꿔야 하는 최대 날 수 : 30
열쇠글 만료 예고를 하는 날 수 : 5
==============================================================================
==============================================================================
LAB> usermod 를 이용해서 사용자 정보를 수정해보자.
usermod 는 사용자의 /etc/passwd 정보를 수정하는 명령어다.
옵션은 useradd 옵션과 거의 동일하다.
!!! 사용자 정보가 담겨있는 /etc/passwd 파일을 수정할려면 반드시 usermod, vipw
!!! 명령어를 사용한다. vi 로는 /etc/passwd 를 수정하지 말고 가급적이면
!!! usermod, vipw 명령어를 이용하는 것이 좋다.
- user4 계정을 삭제한다. (-r 옵션이 있으므로 홈디렉토리까지 모두 삭제한다.)
# userdel -r user4
- uid 5000 에 해당하는 사용자 계정 user4를 생성한다.
# useradd -u 5000 user4
# grep user4 /etc/passwd
user4:x:5000:5000::/home/user4:/bin/bash
- user4 계정의 쉘을 /bin/bash -> /bin/sh 로 변경한다.
# usermod -s /bin/sh user4
# grep user4 /etc/passwd
user4:x:5000:5000::/home/user4:/bin/sh
~~~~~~~~
- user4 계정의 설명문을 변경한다.
# usermod -c 010-4064-9225 user4
# grep user4 /etc/passwd
user4:x:5000:5000:010-4064-9225:/home/user4:/bin/sh
- user4 계정의 기본그룹을 5000 -> 100 으로 변경한다.
# usermod -g 100 user4
# grep user4 /etc/passwd
user4:x:5000:100:010-4064-9225:/home/user4:/bin/sh
# su - user4
$ id
uid=5000(user4) gid=100(users) groups=100(users) ...
~~~~~~~~~~~~~~
$ exit
# usermod -g 5000 user4
$ id
uid=5000(user4) gid=5000(user4) groups=5000(user4)
~~~~~~~~~~~~~~~
- user4 계정의 홈디렉토리를 /tmp 디렉토리로 변경한다.
# usermod -d /tmp user4
# grep user4 /etc/passwd
user4:x:5000:100:010-4064-9225:/tmp:/bin/sh
# su -
$ pwd
/tmp
==============================================================================
==============================================================================
LAB> 위 LAB 을 이용해서 아래 조건에 해당하는 사용자를 생성하시오.
-- 조건 --
-----------+------
groupname | gid
-----------+------
infosec | 9000
gangnam | 8000
-----------+------
---------+------+------+-----------+----------------+-----------
account | uid | gid | comment | homedir | shell
---------+------+------+-----------+----------------+-----------
bluesky | 7000 | 9000 | testuser1 | /home1/bluesky | /bin/sh
hiseoul | 7005 | 8000 | seouluser | /home2/hiseoul | /bin/bash
---------+------+------+-----------+----------------+-----------
-- 조건 --
# mkdir /home1
# groupadd -g 9000 infosec
# useradd -u 7000 -g 9000 -c testuser1 -d /home1/bluesky -s /bin/sh bluesky
# tail -1 /etc/{passwd,group,shadow}
# ls /home1
# su - bluesky
$ id
$ pwd
# mkdir /home2
# groupadd -g 8000 gangnam
# useradd -u 7005 -g gangnam -c seouluser -d /home2/hiseoul -s /bin/bash hiseoul
# tail -1 /etc/{passwd,group,shadow}
# ls /home2
# su - hiseoul
$ id
$ pwd
==============================================================================
==============================================================================
LAB> 사용자의 정보를 구하는 프로그래밍을 해보자.
# vi struct.c
-- struct.c --
#include <stdio.h>
struct test
{
int i;
int j;
};
int main()
{
struct test abc;
abc.i = 10;
abc.j = 20;
printf("abc.i = %d, abc.j = %d \n", abc.i, abc.j);
return 0;
}
-- struct.c --
# gcc -o struct struct.c
# ./struct
abc.i = 10, abc.j = 20
# cp struct.c struct2.c
# vi struct2.c
-- struct2.c --
#include <stdio.h>
struct test
{
int i;
int j;
};
int main()
{
struct test abc, *p;
p = &abc;
p->i = 10;
p->j = 20;
printf("p->i = %d, p->j = %d \n", p->i, p->j);
return 0;
}
# cat /usr/include/pwd.h
:
struct passwd
{
char *pw_name; /* Username. */
char *pw_passwd; /* Password. */
__uid_t pw_uid; /* User ID. */
__gid_t pw_gid; /* Group ID. */
char *pw_gecos; /* Real name. */
char *pw_dir; /* Home directory. */
char *pw_shell; /* Shell program. */
};
:
:
# vi userinfo.c
-- userinfo.c --
#include <stdio.h> // /usr/include/stdio.h
#include <unistd.h> // /usr/include/unistd.h
#include <pwd.h> // /usr/include/pwd.h
#include <sys/types.h> // /usr/include/sys/types.h
int main()
{
char username[] = "bluesky";
struct passwd *userpw;
userpw = getpwnam(username);
printf("account : %s \n", userpw->pw_name);
printf("uid : %d \n", userpw->pw_uid);
printf("gid : %d \n", userpw->pw_gid);
printf("comment : %s \n", userpw->pw_gecos);
printf("home dir : %s \n", userpw->pw_dir);
printf("shell : %s \n", userpw->pw_shell);
return 0;
}
-- userinfo.c --
# gcc -o userinfo userinfo.c
# ./userinfo
account : bluesky
uid : 7000
gid : 9000
comment : 148201500
home dir : /home1/bluesky
shell : /bin/sh
# usermod -g 100 bluesky
# grep bluesky /etc/passwd
bluesky:x:7000:100:testuser1:/home1/bluesky:/bin/sh
# ./userinfo
account : bluesky
uid : 7000
gid : 100
comment : 157347867
home dir : /home1/bluesky
shell : /bin/sh
==============================================================================
==============================================================================
LAB> /etc/{passwd-,group-,shadow-} 파일을 살펴보자.
# cd /etc; for i in passwd group shadow
> do
> tail -1 $i
> done
test123456:x:5008:5008::/home/test123456:/bin/bash
test123456:x:5008:
test123456:!!:16794:0:99999:7:::
[root@localhost etc]# userdel -r test123456
[root@localhost etc]# for i in passwd group shadow; do tail -1 $i; done
test12345:x:5007:5007::/home/test12345:/bin/bash
test12345:x:5007:
test12345:!!:16794:0:99999:7:::
[root@localhost etc]# for i in passwd- group- shadow-; do tail -1 $i; done
test123456:x:5008:5008::/home/test123456:/bin/bash
test123456:x:5008:
test123456:!!:16794:0:99999:7:::
==============================================================================
==============================================================================
LAB> 그룹의 비번 설정하기
그룹의 쉐도우 파일 (원래는 없다. gpasswd 명령어로 그룹에 비번을 설정해야만 생긴다. )
/etc/gshadow
# groupdel ccnagroup
# groupadd ccnagroup
# gpasswd ccnagroup
Changing the password for group ccnagroup
New Password: <-- 비번입력
Re-enter new password: <-- 비번입력
# useradd -g ccnagroup cdy
# useradd -g ccnagroup ldw
# useradd user1
# useradd user2
# gpasswd -A user1 ccnagroup
# gpasswd -A user2 ccnagroup
# grep ccnagroup /etc/group
ccnagroup:x:2014:
# su - user1
$ id
uid=508(user1) gid=508(user1) groups=508(user1)
$ newgrp ccnagroup <-- ccnagroup 으로 변경한다.
Password:
$ id
uid=508(user1) gid=2014(ccnagroup) groups=508(user1),2014(ccnagroup)
==============================================================================
==============================================================================
LAB> 특정 파일에서 문자를 찾아보자.
!!! awk, grep, egrep, fgrep !!!
!!! grep 3형제는 약간의 차이가 존재한다. !!!
# awk /user1/ /etc/{passwd,shadow,group}
user1:x:506:2014::/home/user1:/bin/bash
user1:!!:15959:0:99999:7:::
user1:x:2014:
# grep user1 /etc/{passwd,shadow,group}
/etc/passwd:user1:x:506:2014::/home/user1:/bin/bash
/etc/shadow:user1:!!:15959:0:99999:7:::
/etc/group:user1:x:2014:
# egrep user1 /etc/{passwd,shadow,group}
/etc/passwd:user1:x:506:2014::/home/user1:/bin/bash
/etc/shadow:user1:!!:15959:0:99999:7:::
/etc/group:user1:x:2014:
# fgrep user1 /etc/{passwd,shadow,group}
/etc/passwd:user1:x:506:2014::/home/user1:/bin/bash
/etc/shadow:user1:!!:15959:0:99999:7:::
/etc/group:user1:x:2014:
- symbolic link & hard link
# ls -li `which grep`
196654 -rwxr-xr-x 1 root root 85060 9월 27 2009 /bin/grep
# ls -li `which egrep`
196629 lrwxrwxrwx 1 root root 4 3월 9 2015 /bin/egrep -> grep
# ls -li `which fgrep`
196630 lrwxrwxrwx 1 root root 4 3월 9 2015 /bin/fgrep -> grep
# ls -li `which mke2fs`
983119 -rwxr-xr-x 3 root root 47300 7월 22 2011 /sbin/mke2fs
# ls -li `which mkfs.ext2`
983119 -rwxr-xr-x 3 root root 47300 7월 22 2011 /sbin/mkfs.ext2
# ls -li `which mkfs.ext3`
983119 -rwxr-xr-x 3 root root 47300 7월 22 2011 /sbin/mkfs.ext3
==============================================================================
==============================================================================
LAB> 사용자를 보조그룹에 포함시켜보자.
- -g 옵션과 -G 옵션에 대해서 알아볼 것!!!
- -G 옵션은 보조그룹에 포함시키는 옵션이다.
# grep users /etc/group
users:x:100:
# useradd cdy
# useradd ldw
# usermod -G users cdy
# usermod -G users ldw
# useradd user100
# usermod -G users user100
# grep users /etc/group
users:x:100:cdy,ldw,user100
# egrep 'cdy|ldw' /etc/group
users:x:100:cdy,ldw,user100
# egrep 'cdy|ldw' /etc/passwd
cdy:x:5008:6001::/home/cdy:/bin/bash
ldw:x:5009:6001::/home/ldw:/bin/bash
==============================================================================
==============================================================================
LAB> 다양하게 그룹을 만들어서 사용자를 생성해보자.
- -g 옵션과 -G 옵션을 이용해서 다양하게 사용자를 생성해보자.
# groupadd -g 3000 hack
# grep hack /etc/passwd
# grep hack /etc/group
hack:x:3000:
# grep hack /etc/shadow
# useradd -u 9000 -g hack hackuser1
# grep hack /etc/passwd
hackuser1:x:9000:3000::/home/hackuser1:/bin/bash
# grep hack /etc/group
hack:x:3000:
# grep hack /etc/shadow
hackuser1:!!:16794:0:99999:7:::
# useradd -u 9002 hackuser2
# grep hack /etc/passwd
hackuser1:x:9000:3000::/home/hackuser1:/bin/bash
hackuser2:x:9002:9002::/home/hackuser2:/bin/bash
# grep hack /etc/group
hack:x:3000:
hackuser2:x:9002:
# grep hack /etc/shadow
hackuser1:!!:16794:0:99999:7:::
hackuser2:!!:16794:0:99999:7:::
# useradd -u 9003 -G users hackuser3
# grep hack /etc/passwd
hackuser1:x:9000:3000::/home/hackuser1:/bin/bash
hackuser2:x:9002:9002::/home/hackuser2:/bin/bash
hackuser3:x:9003:9003::/home/hackuser3:/bin/bash
# grep hack /etc/group
users:x:100:cdy,ldw,user100,hackuser3
hack:x:3000:
hackuser2:x:9002:
hackuser3:x:9003:
# grep hack /etc/shadow
hackuser1:!!:16794:0:99999:7:::
hackuser2:!!:16794:0:99999:7:::
hackuser3:!!:16794:0:99999:7:::
==============================================================================
==============================================================================
LAB> 명령어를 이용해서 사용자를 추가해보자.
**************************************************************************
o 사용자를 생성할 때 시스템에서 변경되는 내용들
1. /etc/passwd : 사용자에 대한 정보가 반드시 한 줄 추가된다.
2. /etc/group : 사용자가 속한 그룹에 대한 정보가 한 줄 추가된다.
- 상황에 따라서 생성될 수도 있고 생성이 안될 수도 있다.
- (-g 옵션이 없다면 사용자의 UID 와 같은 GID가 한 줄 추가된다.)
- (-g 옵션을 주고 사용자의 GID가 이미 /etc/group에 존재하면 생성되지 않는다.)
- (-G 옵션이면 기존 그룹에 사용자가 포함된다.)
3. /etc/shadow : 사용자에 대한 정보가 반드시 한 줄 추가된다.
4. /home 디렉토리에 사용자의 홈디렉토리가 생성된다.
- /home/username 에 해당하는 권한으로 홈디렉토리가 변경된다.
6. /etc/skel 디렉토리의 모든 파일들을 사용자 홈디렉토리에 복사한다.
7. /var/spool/mail 디렉토리에 메일이 저장되는 사용자 메일 스풀 파일이 생성된다.
**************************************************************************
사용자 : testuser
비번 : 12345
# echo testuser:x:7000:7000::/home/testuser:/bin/bash >> /etc/passwd
# echo testuser:x:7000: >> /etc/group
# echo 'testuser:!!:15477:0:99999:7:::' >> /etc/shadow
# mkdir -m700 /home/testuser
# cp /etc/skel/.* /home/testuser
# chown -R testuser.testuser /home/testuser
# touch /var/spool/mail/testuser
# chmod 660 /var/spool/mail/testuser
# chown testuser.testuser /var/spool/mail/testuser
# echo "12345" | passwd --stdin testuser
# grep testuser /etc/passwd
testuser:x:7000:7000::/home/testuser:/bin/bash
# grep testuser /etc/shadow
testuser:$1$PN6Supt1$7jbChpjT6hBlyysc3L.nh/:15484:0:99999:7:::
# ssh testuser@localhost
<-- 12345 입력 후 로그인이 되면 성공!!!
==============================================================================
LAB > /etc/passwd, /etc/shadow 파일을 cat 명령어를 이용해서
출력하는데 아래 사용자로 변경해서 출력해보자.
1. testuser 출력
# su - testuser
$ whoami
$ id
$ head -1 /etc/passwd <-- 볼 수 있다.
root:x:0:0::/root:/bin/bash
$ head -1 /etc/shadow <-- 못본다.
$ exit
LAB> /etc/passwd 파일에 암호가 들어있게 변경해보자.
pwunconv : shadow 파일을 사용안함
pwconv : shadow 파일을 사용함
# pwunconv <-- shadow 시스템을 해제
# ls -l /etc/shadow <-- 파일이 존재하지 않음
# grep testuser /etc/passwd
# su - testuser
$ grep testuser /etc/passwd
testuser:$1$PN6Supt1$7c3L.nh/:501:501::/home/testuser:/bin/bash
$ exit
# pwconv <-- shadow 시스템으로 전환
존더리퍼로 비번을 크랙으로 깰 수 있어서 요즘의 모든
시스템에서는 shadow 시스템으로 구동되고 있다.
A ---> B
/etc/passwd /etc/shadow
user1 ---> user1 비번
user2 ---> user2 비번
user3
user4
...
user5000 ---> user5000 비번
user200 ~ user500
user1500 ~ user2300
# cat /etc/default/useradd
LAB> 사용자를 생성하는데 /home2 밑에 홈디렉토리가 만들어지도록
사용자를 생성하시오.
사용자 : usa1, usa2
바꾸는 방법 두가지가 존재
1. 옵션을 주는 방법 : useradd 명령어에서 -d 옵션을 사용
2. 파일을 수정하는 방법 : /etc/default/useradd 를 편집
1번은 useradd 명령어를 칠때마다 매번 -d 옵션을 써야한다.
2번은 영구적으로 사용할 수 있다.
1번으로 실행
# useradd -d /home2/usa1 usa1
# ls -F /home2
2번으로 실행
# vi /etc/default/useradd
HOME=/home2 <-- 변경
# useradd usa2
# ls -F /home2
LAB> 사용자를 만들면서 아래에 나오는 그룹에 포함시키시오.
사용자 1 : testuser1 그룹 : testuser1, users
사용자 2 : testuser2 그룹 : users
사용자 3 : testuser3 그룹 : webuser
사용자 4 : testuser4 그룹 : boanin, users
groupadd : 그룹을 생성하는 명령어
useradd 옵션 : -g -G 그룹에 포함시키는 옵션
-g : 기본그룹, -G : 보조그룹
*** 참고로 리눅스를 설치하면 users 라는 그룹이 만들어진다. ***
*** 그룹을 생성할때 그룹이 /etc/group 에 없다면 먼저 그룹을
*** 생성해줘야 한다. 단!!! 그룹이 생성되는 사용자의 이름과
*** 같은 그룹명이라면 생성시켜주지 않아도 된다.
*** 그룹을 생성하는 조건 : 사용자명과 틀릴 경우이다. ***
# useradd -G users testuser1
# grep testuser1 /etc/group
users:x:100:testuser1
testuser1:x:507: <-- 출력된다.
# useradd -g users testuser2
# grep testuser2 /etc/group
<-- 출력이 안된다.
# groupadd webuser
# useradd -g webuser testuser3
# grep testuser3 /etc/group
<-- 출력이 안된다.
# groupadd boanin
# useradd -g boanin -G users testuser4
# grep testuser4 /etc/group
users:x:100:testuser1,testuser4 <-- 출력된다.
옵션을 확인 ( 확실히 알아둘 것!!! )
# usermod
# useradd
o 변경하는 방법
1. vi 편집기를 이용하는 방법
# grep linux /etc/passwd <-- linux GID 확인하고 변경하는 연습
# usermod -L linux <-- linux 사용자의 비번을 Lock 을 건다.
# awk /linux/ /etc/shadow
linux:!$1$zrHR/B5H$qf./WNP2UCTh6.FsIEk.e0:15490:0:99999:7:::
# usermod -U linux <-- Unlock
# awk /linux/ /etc/shadow
linux:$1$zrHR/B5H$qf./WNP2UCTh6.FsIEk.e0:15490:0:99999:7:::
o 사용자를 로그인 시킬려면
1. 사용자 생성 useradd -> /etc/shadow 비밀번호 필드에 !! 가 들어가 있다.
2. 비밀번호 부여 passwd
===============================================
비밀번호 없이 접근하는 방법
# passwd -uf testuser4
# vi /etc/ssh/sshd_config
PermitEmptyPasswords yes
# /etc/init.d/sshd restart
자신의 IP로 testuser3 , testuser4 로그인
# useradd -o -u 0 r00t
# passwd -uf r00t
자신의 IP로 r00t 로그인
id 실행
===============================================
==============================================================================
LAB> 사용자를 생성하는데 2015년 12월 25일 까지만 사용하는 사용자를 생성하시오.
!!! 시스템에 시간을 설정하는 방법은 두 가지가 존재한다.
!!! 1. 타임서버에 접속해서 시간을 동기화하는 방법
!!! 2. 사용자가 date 명령어로 직접 세팅하는 방법
!!! date 명령어로 시간을 설정하는 방법
!!! 사용법 : date 월일시분년도.초
!!!
!!! e.g.)
!!! - 2015년 4월 27일 09:47 30초 로 설정
!!! # date 042709472015.30
!!!
!!! - Mon Apr 27 09:47:30 KST 2015
!!! # 2016년 1월 7일 18:30:20
!!! # date 010718302016.20
# date
Fri Apr 24 16:21:41 KST 2015
# useradd -e 2015-12-25 xmasuser
# passwd xmasuser
- xmasuser 로 로그인한다.
# ssh xmasuser@localhost
$ id
$ exit
# chage -l username
- 현재시간을 date 명령어로 변경한다.
# date 122823592015
Mon Dec 28 23:59:00 KST 2015
- xmasuser 로 로그인하면 사용기간이 만료되었으므로 접속이 안되는 것을 알 수 있다.
# ssh xmasuser@localhost
xmasuser@localhost's password:
Your account has expired; please contact your system administrator
Connection closed by 127.0.0.1
==============================================================================
==============================================================================
LAB> 사용자를 생성하는데 생성일 부터 10일까지만 사용하는 사용자를 생성하시오.
# rdate -s time.bora.net
# route -n
# cat /etc/resolv.conf
-- /etc/resolv.conf --
nameserver 168.126.63.1
nameserver 168.126.63.2
-- /etc/resolv.conf --
#
# useradd user1
# useradd -f 10 user11
# chage -l user1
# chage -l user11
# tail -2 /etc/shadow
user1:!!:16510:0:99999:7:::
user11:!!:16510:0:99999:7:10::
==============================================================================
==============================================================================
LAB> 아래 조건에 해당하는 사용자 3명을 생성하고 로그인을 설정하시오.
-- 조건 --
1. 기존 사용자가 존재하면 삭제하고 다시 생성한다.
2. 사용자에 대한 정보
ACCOUNT UID 기본그룹 보조그룹 설명문 디렉토리 쉘
mysqld 27 27 mysql user /mysqldata /sbin/nologin
qmail qmail qmail user /var/qmail /bin/false
khuser 8000 8000 100 /home2/khuser /bin/bash
-- 조건 --
- mysqld 사용자 생성
# useradd -u 27 -c "mysql user" -d /mysqldata -s /sbin/nologin mysqld
useradd: UID 27 is not unique
# grep 27 /etc/passwd
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
# userdel -r mysql
# useradd -u 27 -c "mysql user" -d /mysqldata -s /sbin/nologin mysqld
# grep 27 /etc/passwd
mysqld:x:27:27:mysql user:/mysqldata:/sbin/nologin
- qmail 사용자 생성
# useradd -c "qmail user" -d /var/qmail -s /bin/false qmail
# tail -1 /etc/{passwd,group,shadow}
- khuser 사용자 생성
# ls -ld /home2
ls: /home2: No such file or directory
# echo $?
2
- ls 리턴값 $? 이 0 이 아니면 /home2 디렉토리가 없으므로 이때는 /home2
디렉토리를 생성하고 사용자를 생성한다.
있다면 디렉토리 생성만 한다.
# mkdir /home2
# useradd -u 8000 -G 100 -d /home2/khuser -s /bin/bash khuser
==============================================================================