o 사용자의 종류
슈퍼유저(로그인O), 시스템유저(로그인X), 일반유저(로그인O)
o 사용자관련 명령어
디렉토리 : /usr/bin
chage faillog gpasswd lastlog newgrp sg
chage
-m [최소 날짜] : 패스워드 변경 후 다시 변경할 수 있는 최소 날짜를 지정한다. (최소 사용 기간)
-M [최대 날짜] : 패스워드가 유효한 최대 날짜를 지정한다.
-d [마지막 날짜] : 패스워드의 마지막 변경 날짜를 YYYY-MM-DD 형태로 나타낸다.
-E [만료 날짜] : 사용자 계정의 사용 만료 날짜를 지정한다. 만료 날짜에 -1을 넣으면 만료 일자 설정이 해제된다. (최대 사용 기간)
-I [비활성화기간] : 사용자 계정이 비활성화되는 기간을 설정한다. 비활성화기간에 -1을 넣으면 비활성화기간 설정이 해제 된다.
-W [경고날짜] : 패스워드 만기 전에 안내 메시지 보낼 날짜를 지정한다.
-l user : 사용자의 패스워드 만기 정보를 출력한다.
[네이버 지식백과] chage (유닉스 리눅스 명령어 사전, 2010. 11. 30., 한빛미디어)
faillog -a // faillog -u root // faillog -r root (실패 횟수 초기화)
gpasswd --> newgrp / sg 명령어 사용 시 필요한 group passwd
lastlog // lastlog -u root
newgrp / sg 기능은 비슷
newgrp 그룹명 / sg 그룹명 --> id 확인하면 gid가 바껴있음
디렉토리 :
adduser chpasswd groupadd groupdel groupmod grpck grpconv grpunconv
newusers pwck pwconv pwunconv useradd userdel usermod
/etc/passwd : 사용자의 정보가 들어있는 DB (text 형태로 저장)
/etc/shadow : 사용자의 비밀번호가 들어있는 DB (text 형태로 저장)
/etc/group : 그룹에 대한 정보가 들어있는 DB (text 형태로 저장)
o /etc/passwd, /etc/passwd- (백업)
- 사용자의 정보가 담겨있는 파일
/etc/passwd 파일 구조 (rw-r--r-- root root)
username:password:uid:gid:comment:homedirectory:shell
1 2 3 4 5 6 7
1. 사용자 이름(계정명)
2. 암호화된 비밀번호 (현재는 사용하지 않으므로 단순히 x문자가 들어있다.)
3. UID(사용자에게 부여된 번호)
4. GID(그룹에게 부여된 번호) (기본그룹 : main그룹)
5. 설명문
6. 사용자의 홈디렉토리(사용자가 로그인할때 작업하는 공간)
7. 로그인 쉘(사용자가 로그인할때 사용하는 프로그램)
/etc/passwd 파일의 구조체를 확인하기 위해서는 /usr/include/passwd.h 에서
struct passwd를 확인한다.
o /etc/group, /etc/group- (백업)
- 그룹의 정보가 담겨있는 파일
/etc/group 파일 구조
username:password:gid:members
1 2 3 4
1. 그룹 이름
2. 그룹 비밀번호
3. GID
4. 이 그룹에 속한 멤버들
/etc/group 파일의 구조체를 확인하기 위해서는 /usr/include/grp.h 에서
struct group를 확인한다.
o /etc/shadow, /etc/shadow- (백업)
- 사용자의 비밀번호 정보가 담겨있는 파일
/etc/shadow 파일 구조
username:password:lastchge:mindays:maxdays:warndays:inactive:expire:flag
1 2 3 4 5 6 7 8 9
1. 사용자 이름
2. 암호화된 비밀번호
3. lastchge 최근 비밀번호 변경일 (1970년1월1일 기준의 날짜 수: timestamp)
4. min 비밀번호 변경 후, 재설정을 위한 대기일 수
5. max 비밀번호 유효기간
6. warn 비밀번호 변경 경고 시간
7. inactive 비밀번호 유효 기간 (5일이면, 5일에 한번은 들어가야 된다.)
8. expire 비밀번호 만료 기간 이후 계정을 사용할 수 없게 되는 기간
9. flag 현재는 사용되지 않으며, 0으로 지정
/etc/shadow 파일의 구조체를 확인하기 위해서는 /usr/include/shadow.h 에서
struct spwd를 확인한다.
o 사용자를 생성할때 참고하는 파일/디렉토리
-rw------- 1 root root 119 Feb 23 2012 /etc/default/useradd
-rw-r--r-- 1 root root 1503 Feb 23 2012 /etc/login.defs
drwxr-xr-x 3 root root 4096 Sep 7 2013 /etc/skel/
o 레드햇계열의 배포판에서 사용되는 사용자 목록이 담겨있는 파일
# cat /usr/share/doc/setup-*/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 사용자의 홈디렉토리 : /home/<사용자명>
- 관리자만 빼고 일반유저의 홈디렉토리는 /home 디렉토리에 위치한다.
- 그렇다고 꼭 /home 디렉토리가 사용자의 홈디렉토리가 위치하는 것은 아니다.
ex)
root : /root
linux : /home/linux
unix : /home/unix
windows : /home/windows
freebsd : /home1/freebsd
# cd /home/linux O
# cat /etc/default/useradd
...
HOME=/home1
...
/etc/default/useradd 에 써져있는데
HOME=의 경로를 따른다.
# useradd freebsd
# cd /home/freebsd X
# cd ~freebsd O ( /home1/freebsd )
linux, unix -> 홈디렉토리 & mail spool 파일 삭제 O
# userdel -r linux
# userdel -r unix
-r 옵션을 주면 사용자의 홈디렉터리와
사용자의 메일스폴디렉터리도 삭제된다.
# ls /home
# ls -l /var/spool/mail/linux <-- 삭제
# ls -l /var/spool/mail/unix <-- 삭제
windows -> 홈디렉토리를 & mail spool 파일 삭제 X
# userdel windows
-r 옵션이 없어서 사용자는 삭제 되지만
홈디렉터리와 스폴디렉터리는 삭제 안됨
# ls /home
lost+found windows
~~~~~~~
# ls -l /var/spool/mail/windows <-- 삭제안됨
==============================================================================
실습> 사용자를 생성하고 확인해보자.
# useradd user1
# useradd user2
# useradd user3
# grep ^user[1-3] /etc/{passwd,group,shadow}
^는 맨 앞에 해당하는 걸 의미하고 [1-3]은 1에서 3을 의미
{passwd,group,shadow} 는 passwd, group, shadow 각각을 의미
/etc/passwd:user1:x:502:502::/home/user1:/bin/bash
/etc/passwd:user2:x:503:503::/home/user2:/bin/bash
/etc/passwd:user3:x:504:504::/home/user3:/bin/bash
/etc/group:user1:x:502:
/etc/group:user2:x:503:
/etc/group:user3:x:504:
/etc/shadow:user1:!!:16119:0:99999:7:::
/etc/shadow:user2:!!:16119:0:99999:7:::
/etc/shadow:user3:!!:16119:0:99999:7:::
==============================================================================
==============================================================================
실습> 사용자를 생성하고 삭제해보자.
useradd,adduser : 사용자를 생성하는 명령어
userdel : 사용자를 삭제하는 명령어
Usage: useradd [options] LOGIN
# userdel user1
# userdel user2
# userdel user1
==============================================================================
==============================================================================
실습> 슈퍼유저 root 의 정보를 확인해보자.
# 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
==============================================================================
==============================================================================
실습> useradd의 다양한 옵션을 이용해서 사용자를 생성해보자.
형식 :
# useradd
Usage: useradd [options] LOGIN
# LANG=C
# useradd 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:
사용자를 생성하면 자동으로 UID : 500 GID : 500 으로 생성되고 그 다음 사용자를
생성하면 /etc/passwd 마지막 사용자 다음으로 생성된다.
# 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:
# 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:::
# 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]: 2013-09-20
Password Expiration Warning [7]: 5
Password Inactive [-1]: 20
Account Expiration Date (YYYY-MM-DD) [1969-12-31]: 2013-09-30
/etc/shadow 정보 바꾸기
# grep user4 /etc/shadow
user4:!!:15968:1:30:5:20:15978:
# chage -l user4
Last password change : Sep 20, 2013
Password expires : Oct 20, 2013
Password inactive : Nov 09, 2013
Account expires : Sep 30, 2013
Minimum number of days between password change : 1
Maximum number of days between password change : 30
Number of days of warning before password expires : 5
# passwd --stdin user4
--stdin은 표준입력을 의미
Changing password for user user4.
12345
passwd: all authentication tokens updated successfully.
# grep user4 /etc/shadow
user4:$1$8caiqL1n$NrTDzvDc0pmg5901x67Fb0:15959:1:30:5:20:15978:
# chage -l user4
Last password change : Sep 11, 2013
Password expires : Oct 11, 2013
Password inactive : Oct 31, 2013
Account expires : Sep 30, 2013
Minimum number of days between password change : 1
Maximum number of days between password change : 30
Number of days of warning before password expires : 5
usermod 는 사용자의 /etc/passwd 정보를 수정하는 명령어다.
옵션은 useradd 옵션과 거의 동일하다.
==============================================================================
실습> usermod 를 이용해서 사용자 정보를 수정해보자.
!!! 사용자 정보가 담겨있는 /etc/passwd 파일을 수정할려면 반드시 usermod, vipw
!!1 명령어를 사용한다. vi 로는 /etc/passwd 를 수정하면 안된다. !!!
# grep user4 /etc/passwd
user4:x:5000:5000:testuser:/home/linuxuser4:/bin/sh
# usermod -s /bin/bash user4
# grep user4 /etc/passwd
user4:x:5000:5000:testuser:/home/linuxuser4:/bin/bash
# usermod -c 010-4064-9225 user4
# grep user4 /etc/passwd
user4:x:5000:5000:010-4064-9225:/home/linuxuser4:/bin/bash
# usermod -g 100 user4
# grep user4 /etc/passwd
user4:x:5000:100:010-4064-9225:/home/linuxuser4:/bin/bash
# usermod -d /home/user4 user4
# grep user4 /etc/passwd
user4:x:5000:100:010-4064-9225:/home/user4:/bin/bash
==============================================================================
==============================================================================
실습> 그룹의 비번 설정하기
그룹의 쉐도우 파일 (원래는 없다. gpasswd 명령어로 그룹에 비번을 설정해야만 생긴다. )
/etc/gshadow
# 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) context=user_u:system_r:unconfined_t:s0
$ newgrp ccnagroup <-- ccnagroup 으로 변경한다.
Password:
$ id
uid=508(user1) gid=2014(ccnagroup) groups=508(user1),2014(ccnagroup) context=user_u:system_r:unconfined_t:s0
==============================================================================
==============================================================================
실습> 특정 파일에서 문자를 찾아보자.
!!! 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:
==============================================================================
==> 차이점은 다~~음에 올릴듯 다~~~~~~~음
==============================================================================
실습> 사용자를 보조그룹에 포함시켜보자.
# grep users /etc/group
users:x:100:
# usermod -G users cdy
# usermod -G users ldw
# usermod -G users user100
# grep users /etc/group
users:x:100:cdy,ldw,user100
==============================================================================
o 사용자를 생성을 하면 시스템에서 변경되는 내용들
1. /etc/passwd 사용자에 대한 정보가 한 줄 추가
2. /etc/group 사용자의 그룹에 대한 정보가 한 줄 추가
3. /etc/shadow 사용자에 대한 정보가 한 줄 추가
4. /home 디렉토리에 사용자 홈디렉토리가 생성
5. /var/spool/mail 디렉토리에 사용자 메일 스풀 파일이 생성
o 명령어를 이용해서 사용자를 추가
사용자 : testuser
비번 : 12345
# cp /etc/passwd /etc/shadow /etc/group ~
# echo testuser:x:501:501::/home/testuser:/bin/bash >> /etc/passwd
# echo testuser:x:501: >> /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 <-- 비번 부여
- testuser 로 로그인 -
# grep testuser /etc/passwd -> 일반사용자도 볼 수 있다.
testuser:x:501:501:010-4064-9225:/home/testuser:/bin/bash
~~~~ ~~~~ ~~~~~~~~ ~~~~~~~~~ ~~~~~
USER UID GID Commant HOME SHELL
~
문자 x 로 표시 -> /etc/shadow
환경변수 : 대문자
# grep testuser /etc/shadow -> root 만이 볼 수 있다. 일반유저 X
testuser:$1$PN6Supt1$7jbChpjT6hBlyysc3L.nh/:15484:0:99999:7:::
~~~~~~~~~~~~~~~~~~~~~~
비밀번호
실습 > /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
실습> /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
실습> 사용자를 생성하는데 /home2 밑에 홈디렉토리가 만들어지도록
사용자를 생성하시오.
--> 미리 /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
실습> 사용자를 만들면서 아래에 나오는 그룹에 포함시키시오.
사용자 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
LAB> 아래 사용자를 조건에 맞게 생성하시오.
user1 : /home2/user1 UID : 502 SHELL : /bin/bash
user2 : /home/user2 UID : 510 SHELL : /bin/sh
user3 : /home3/user3 UID : 520 SHELL : /bin/tcsh
user4 : /home/user4 UID : 521 SHELL : /bin/bash
user5 : /home2/user5 UID : 505 SHELL : /bin/bash
# mkdir /home2
# mkdir /home3
# useradd -u 502 -d /home2/user1 user1
# useradd -u 510 -d /home/user2 -s /bin/sh user2
# useradd -u 520 -d /home3/user3 -s /bin/tcsh user3
# useradd -d /home/user4 user4
# useradd -u 505 -d /home2/user5 user5
# tail -5 /etc/passwd
user1:x:502:502::/home2/user1:/bin/bash
user2:x:510:510::/home/user2:/bin/sh
user3:x:520:520::/home3/user3:/bin/tcsh
user4:x:521:521::/home/user4:/bin/bash
user5:x:505:505::/home2/user5:/bin/bash
# for i in $(seq 5) <-- 사용자 user1 ~ user5 까지 삭제
> do
> userdel -r user$i
> done
--> 쉘 스크립트임
반복문 $ 는 변수 의미 seq 5는 1에서5까지임
for 변수명 in $변수에 넣을거
do
반복할 명령어
done
!!! 간혹 로그인하면 아래처럼 프롬프트가 bash 가 나올때가 있다.
!!! 이유는 자신의 홈디렉토리에 .bash_profile .bashrc 가 삭제되서
!!! 그런것이므로 /etc/skel 디렉토리에 있는 파일을 자신의
!!! 홈디렉토리에 복사해주면 된다.
-bash-3.2# cd
-bash-3.2# cp /etc/skel/.bashrc .
-bash-3.2# cp /etc/skel/.bash_profile .
LAB> crypt 함수를 이용한 비밀번호 암호화 체크
# vi passwdcheck.c
-- passwdcheck.c --
#include <stdio.h> // printf, fgets
#include <crypt.h> // crypt
#include <string.h> // strlen
int main()
{
char buf[1024];
char key[1024];
printf("input password : ");
fgets(buf, 1024, stdin);
buf[strlen(buf)-1] = '\0';
printf("input key : ");
fgets(key, 1024, stdin);
buf[strlen(key)-1] = '\0';
printf("encrypted password : %s \n", crypt(buf,key));
return 0;
}
-- passwdcheck.c --
# gcc -o passwdcheck passwdcheck.c -lcrypt
# echo 1234 | passwd --stdin user6
Changing password for user user6.
passwd: all authentication tokens updated successfully.
# grep ^user6 /etc/shadow
user6:$1$MdnBQENi$qCeBqn0LC0YxirEbN43rf.:16163:0:99999:7:::
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ./passwdcheck
input password : 1234
input key : $1$MdnBQENi$
encrypted password : $1$MdnBQENi$qCeBqn0LC0YxirEbN43rf.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~