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. 

                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~