#############################################

## 주제 : 사용자와 그룹                    ##

#############################################


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


==============================================================================

'OS > [Linux] CentOS' 카테고리의 다른 글

[CentOS] 13-2. 사용자 생성  (0) 2016.07.10
[CentOS] 13-1. 사용자관리체크  (0) 2016.07.10
[CentOS] 12. HDD 추가하기  (0) 2016.07.10
[CentOS] 11. vi 편집  (0) 2016.07.10
[CentOS] 10-2. suidtest  (0) 2016.07.10

+ Recent posts