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

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

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


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

- 간단한 명령어 살펴보기

df

df -i

free

mount

ifconfig

hostname

uname -a

fdisk -l

e2label /dev/sda1

e2label /dev/sda5

e2label /dev/sda6

e2label /dev/sda7

e2label /dev/sda8

e2label /dev/sda9

cat /etc/fstab

cat /etc/mtab

tune2fs -l /dev/sda1  ~ tune2fs -l /dev/sda9


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

LAB> Linux 에서 HDD 추가하기


-- 작업 순서 --

1. HDD 추가

2. HDD 파티션 분할

3. 파일시스템 생성(포맷)

4. 마운트 디렉토리 생성

5. 마운트(HDD 장치 연결)

6. 마운트 연결 유지

-- 작업 순서 --


1. HDD 추가

- 시스템을 종료한다.

  init 0, halt, poweroff, shutdown -h now 

- SATA hdd 추가한다.

- 시스템을 부팅한다.


2. HDD 파티션 분할

- fdisk -l 명령어로 추가된 hdd를 확인한다.

- fdisk로 hdd 의 파티션을 분할한다.


ex) 추가된 hdd를 primary partition 으로 분할해보세요.

# fdisk /dev/sdb

n -> p -> 1 -> 엔터 -> 엔터 -> p -> w


# fdisk -l /dev/sdb


Disk /dev/sdb: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1        1044     8385898+  83  Linux


3. 파일시스템 생성(포맷)

- mkfs, mke2fs, mkfs.ext2, mkfs.ext3 명령어를 이용해서 포맷한다.

- 리눅스 파일시스템 : ext -> ext2 -> ext3 -> ext4 

                                     ~~~~

- 아래 둘 중 하나를 선택해서 실행하면 된다.

# mkfs.ext2 -j /dev/sdb1

# mkfs.ext3 /dev/sdb1


4. 마운트 디렉토리 생성

- /data 디렉토리에 새로운 HDD를 연결한다.

# mkdir /data

# ls /

... data ...


5. 마운트(HDD 장치 연결)

- 새로운 HDD의 첫 번째 파티션과 /data 디렉토리를 마운트(연결)한다.

- # mount --help  or # man mount

- 장치 연결 : 

  mount 명령어를 사용한다.

  형식 : mount -t 파일시스템타입  연결할장치명 연결할디렉토리

- 장치 해제 : 

  umount 명령어를 사용한다.

  형식 : umount 연결된장치명   or umount 연결된디렉토리

- 참고로 파일시스템이 ext3일 경우에는 -t 옵션을 생략할 수 있다.


# cat /etc/mtab

# mount -t ext3 /dev/sdb1 /data

# df

# mount

# cat /etc/mtab


# umount /dev/sdb1

  or

# umount /data


# df

  :

/dev/sdb1              8254240    149628   7685320   2% /data


- 100M 짜리 파일을 생성한다.

# dd if=/dev/zero of=/data/testfile bs=1024 count=100000

# df

  :

/dev/sdb1              8254240    249736   7585212   4% /data


6. 마운트 연결 유지

- 장치에 lable 명을 지정하고 /etc/fstab 을 편집한다.

# e2label /dev/sdb1 /data

# vi /etc/fstab

-- /etc/fstab --

  :

  :

LABEL=/boot             /boot                   ext3    defaults        1 2

LABEL=/data             /data                   ext3    defaults        1 2

  :

-- /etc/fstab --


- 시스템을 재부팅해서 /data 디렉토리의 마운트된 정보를 df로 확인한다.

  init 6, reboot, Ctrl + Alt + Del, shutdown -r now 

# df

  :

  :

/dev/sdb1              8254240    249736   7585212   4% /data

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


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

LAB> LABEL명이 틀려서 부팅중 마운트가 안되는 것을 해결하는 방법


!!! 아래처럼 LABEL명에 오타가 발생되면 부팅중에 마운트가 안되고

!!! 중간에 멈추는 현상이 발생된다.

!!! 정상적인 LABEL명 : /data

!!! 테스트 LABEL명   : /data222


-- /etc/fstab --

  :

LABEL=/data222         /data                  ext3    defaults        1 2

  :

-- /etc/fstab --


해결방안


-- 작업 순서 --

1. root 비밀번호 입력

2. / 를 rw(read, write) 상태로 변경

3. /etc/fstab 편집

4. 재부팅

-- 작업 순서 --


1. root 비밀번호 입력

- root 비밀번호를 입력해서 로그인한다.


2. rw(read, write) 상태로 /를 변경

# mount -o remount,rw /


3. /etc/fstab 편집

# vi /etc/fstab

-- /etc/fstab --

  :

LABEL=/data         /data                  ext3    defaults        1 2

  :

-- /etc/fstab --


4. 재부팅

# reboot

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


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

LAB> 아래 조건에 맞는 HDD 더 추가해서 각 디렉토리에 장치를 마운트 하시오.


-- 조건 --

1. satahdd1(8G)  -> /data 

- 이전 랩에서 이미 작업했으므로 여기서는 생략


2. 장치명을 이용해서 마운트


3. HDD 정보

컨트롤로   : SATA

HDD 파일명 : satahdd2 (/dev/sdc)

용량 : 10G

파티션 정보 :    |---------|----------|  

용량   :             5g         5g

장치명 :          /dev/sdc1  /dev/sdc2     

                     |           |

마운트 디렉토리 : /backup     /data2

-- 조건 --



-- 작업 순서 --

1. HDD 추가

- 리눅스서버를 종료한다.


2. HDD 파티션 분할

- fdisk -l 로 추가된 HDD를 확인한다.

# fdisk -l

  :

  :

Disk /dev/sdc: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


Disk /dev/sdc doesn't contain a valid partition table


# fdisk /dev/sdc

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel

Building a new DOS disklabel. Changes will remain in memory only,

until you decide to write them. After that, of course, the previous

content won't be recoverable.



The number of cylinders for this disk is set to 1044.

There is nothing wrong with that, but this is larger than 1024,

and could in certain setups cause problems with:

1) software that runs at boot time (e.g., old versions of LILO)

2) booting and partitioning software from other OSs

   (e.g., DOS FDISK, OS/2 FDISK)

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)


Command (m for help): p


Disk /dev/sdc: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System


Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-1044, default 1): 

Using default value 1

Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044): +5g


Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 2

First cylinder (610-1044, default 610): 

Using default value 610

Last cylinder or +size or +sizeM or +sizeK (610-1044, default 1044): 

Using default value 1044


Command (m for help): p


Disk /dev/sdc: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sdc1               1         609     4891761   83  Linux

/dev/sdc2             610        1044     3494137+  83  Linux


Command (m for help): w

The partition table has been altered!


Calling ioctl() to re-read partition table.

Syncing disks.


# fdisk -l /dev/sdc


Disk /dev/sdc: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sdc1               1         609     4891761   83  Linux

/dev/sdc2             610        1044     3494137+  83  Linux


3. 파일시스템 생성(포맷)

- ext3 파일시스템을 생성한다.

# mke2fs -j -L/backup /dev/sdc1

# mke2fs -j -L/data2 /dev/sdc2


# e2label /dev/sdc1

/backup

# e2label /dev/sdc2

/data2


4. 마운트 디렉토리 생성

# mkdir /backup /data2


5. 마운트(hdd 장치 연결)

# mount -t ext3 /dev/sdc1 /backup

# mount -t ext3 /dev/sdc2 /data2

# df

Filesystem           1K-blocks      Used Available Use% Mounted on

  :

  :

/dev/sdc1              4814936    140768   4429580   4% /backup

/dev/sdc2              3439216     71596   3192916   3% /data2


6. 마운트 연결 유지

- /etc/fstab 에 마운트에 대한 정보를 추가한다.

# vi /etc/fstab

-- /etc/fstab --

  :

  :

LABEL=/backup           /backup                  ext3    defaults        1 2

LABEL=/data2            /data2                   ext3    defaults        1 2

  :

  :

-- /etc/fstab --


-- 작업 순서 --

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


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

LAB> 아래 조건에 맞는 HDD 더 추가해서 각 디렉토리에 장치를 마운트 하시오.


-- 조건 --

1. UUID를 이용해서 마운트

- UUID=UUID문자열


2. HDD 정보

컨트롤로   : SATA

HDD 파일명 : satahdd3 (/dev/sdd)

용량 : 10G

파티션 정보 :    |---------|----------|----------|

용량   :             3g         3g         4g

장치명 :          /dev/sdd1  /dev/sdd2  /dev/sdd5

                      |          |          |

마운트 디렉토리 : /backup2    /data3     /data4

-- 조건 --


1. HDD 추가

- 생략


2. HDD 파티션 분할

# fdisk -l 

  :

Disk /dev/sdd: 10.7 GB, 10737418240 bytes

255 heads, 63 sectors/track, 1305 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


Disk /dev/sdd doesn't contain a valid partition table


# fdisk /dev/sdd

n -> p -> 1 -> 엔터 -> +3g

n -> p -> 2 -> 엔터 -> +3g

n -> e -> 3 -> 엔터 -> 엔터

n -> l -> 엔터 -> 엔터 


Command (m for help): p


Disk /dev/sdd: 10.7 GB, 10737418240 bytes

255 heads, 63 sectors/track, 1305 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sdd1               1         366     2939863+  83  Linux

/dev/sdd2             367         732     2939895   83  Linux

/dev/sdd3             733        1305     4602622+   5  Extended

/dev/sdd5             733        1305     4602591   83  Linux


# fdisk -l /dev/sdd


Disk /dev/sdd: 10.7 GB, 10737418240 bytes

255 heads, 63 sectors/track, 1305 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sdd1               1         366     2939863+  83  Linux

/dev/sdd2             367         732     2939895   83  Linux

/dev/sdd3             733        1305     4602622+   5  Extended

/dev/sdd5             733        1305     4602591   83  Linux


3. 파일시스템 생성(포맷)

# mkfs.ext3 /dev/sdd1

# mkfs.ext3 /dev/sdd2

# mkfs.ext3 /dev/sdd5


# tune2fs -l /dev/sdd1 | head -4

tune2fs 1.39 (29-May-2006)

Filesystem volume name:   <none>

Last mounted on:          <not available>

Filesystem UUID:          e750b3e6-65de-4d08-aa79-3642c5519dc1


# tune2fs -l /dev/sdd2 | head -4

tune2fs 1.39 (29-May-2006)

Filesystem volume name:   <none>

Last mounted on:          <not available>

Filesystem UUID:          cded0753-548f-4ad5-a58d-6c61f0198420


# tune2fs -l /dev/sdd5 | head -4

tune2fs 1.39 (29-May-2006)

Filesystem volume name:   <none>

Last mounted on:          <not available>

Filesystem UUID:          480254c5-d66e-4cde-9e3c-131eaf0601ca


4. 마운트 디렉토리 생성

# mkdir /backup2 /data3 /data4


5. 마운트(hdd 장치 연결)

# mount /dev/sdd1 /backup2 

# mount /dev/sdd2 /data3

# mount /dev/sdd5 /data4 

# df

  :

  :

/dev/sdd1              2893628     69928   2676708   3% /backup2

/dev/sdd2              2893660     69928   2676740   3% /data3

/dev/sdd5              4530236    140192   4159916   4% /data4


6. 마운트 연결 유지

# vi /etc/fstab

-- /etc/fstab --

  :

  :

UUID=e750b3e6-65de-4d08-aa79-3642c5519dc1 /backup2 ext3    defaults  1 2

UUID=cded0753-548f-4ad5-a58d-6c61f0198420 /data3   ext3    defaults  1 2

UUID=480254c5-d66e-4cde-9e3c-131eaf0601ca /data4   ext3    defaults  1 2

  :

  :

-- /etc/fstab --

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



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

[CentOS] 13-1. 사용자관리체크  (0) 2016.07.10
[CentOS] 13. 사용자관리  (0) 2016.07.10
[CentOS] 11. vi 편집  (0) 2016.07.10
[CentOS] 10-2. suidtest  (0) 2016.07.10
[CentOS] 10-1. suidtest  (0) 2016.07.10

vim_명령어_정리.pdf



- 여러 종류의 편집기들

gedit : Xwindow 에서 사용하는 편집기

pico

nano

emacs : 프로그래머(?)     

vi : 


- vi 로 할 수 있는 것들

1. 프로그래밍

- C, shell, python, perl, php, 프로그래밍 언어

2. 서버의 설정파일을 변경

- 설정파일이 모두 text 형태의 파일로 되어있다.


- 확장된 vi(vim) 패키지 설치하기

# yum -y install vim-enhanced


- 확장된 vi인 vim  

# which vim

/usr/bin/vim


- 기본적인 vi 

# which vi

/bin/vi


- 간단한 vim 실행하기

# vim


F1 


- 사용법 alias 새로운명령어='기존명령어'


# alias vi='vim'

# alias

  :

  :

alias vi='vim'


- vi의 alias를 계속 유지하고 싶다면 로그인시 실행되는 스크립트인

  .bashrc에 내용을 넣으면 된다.

# vi .bashrc

-- .bashrc --

  :

alias vi='vim'

  :

-- .bashrc --


- text를 보는 여러가지 명령어들 

less, more

head,tail

cat, tac

vi, view


- vi 옵션 설정하기 

- vi -> :set all 전체 옵션을 확인할 수 있다.

- $HOME : 자신의 홈디렉토리를 의미한다.

- vi를 실행하면 아래 설정파일에 세팅된 내용대로 실행된다.

설정파일 위치 : $HOME/.vimrc 


옵션의 형식 : 

첫 번째 : set 옵션명(on), set no옵션명(off)

두 번째 : set 옵션명=값

- on/off 두 가지만 있을 때 

옵션 : on

no옵션 : off

set 옵션 : 현재 옵션을 활성화 시킨다.


-- .vimrc --

set nu

set ai

set ci

set bg=dark

set sw=2

set ts=2

-- .vimrc --


바이너리 : cat 으로 볼 수 없다.  hexdump, xxd, objdump, strings


- vi 를 실행하는 방법

1. 그냥 명령어를 실행하는 방법 : vi 

2. 파일명을 주고 명령어를 실행하는 방법 : vi 파일명


명령의 도움말을 확인하기 위해서는 

man 명령어 

명령어 --help  or -h

       ~~~~~~


ex) man ls, man vi

ex) ls --help, vi --help


- vi를 실행하고 아래 명령을 사용한다.

:set     <-- 현재 설정된 옵션을 출력한다.

:set all <-- 모든 옵션을 출력한다.


:set number 

:set



ex) set number , set nonumber

    set ts=8, set ts=10, set ts=2

    

*** 구글가서 set 옵션을 검색 ***


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

LAB> 언어설정 테스트 


Xshell : 기본언어 선택

# LANG=ko_KR.eucKR

# vi eucKR.txt

-- eucKR.txt --

안녕하세요....

-- eucKR.txt --

# file eucKR.txt 

eucKR.txt: ISO-8859 text

# cat eucKR.txt 

안녕하세요....



Xshell : 유니코드 선택

# cat eucKR.txt 

¾??¼¼¿?..


# LANG=ko_KR.utf-8

# vi utf-8.txt 

-- utf-8.txt --

안녕하세요....

-- utf-8.txt --

# file utf-8.txt 

utf-8.txt: UTF-8 Unicode text

# cat utf-8.txt 

안녕하세요....


Xshell : 기본언어 선택

# LANG=ko_KR.eucKR

# cat utf-8.txt 

???????몄??....



-- /etc/sysconfig/i18n --

# cat /etc/sysconfig/i18n 

#LANG="en_US.UTF-8"

LANG="ko_KR.utf-8"

SYSFONT="latarcyrheb-sun16"

-- /etc/sysconfig/i18n --

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


***** 조합 *****

키를 누르면 두 가지 종류의 키가 있다.

첫 번째 키 : 키를 누르는 순간 바로 동작하는 키

두 번째 키 : 키를 누르는 순간 사용자에게 한번 더 입력을 받는 키


숫자 : 반복하는 키 5j , 5W ...

d    : 삭제만 dd, dw, 3dW, d3W

c    : 삭제와 입력 cc, cw, 3cW

y    : 복사 yy p 

f    : 한 줄에서 한 문자를 찾을 때 사용  2fo, fk  

g    : 이동 gg G


1. 바로 반응 O (x,w,j ...)

2. 바로 반응 X (숫자, d, c, f, s, y, ^w ...)

***** 조합 *****


이동키 + 삭제키

이동키 + 복사키


현재 라인에서 아래쪽으로 3줄을 복사한 후 붙여넣기를 한다.

- 3yy p   y3yp

현재 커서 위치에서 3단어를 복사한 후 아무곳에 붙여넣기를 한다.

- 3yW p  y3W p

현재 라인을 10번 복사한 후 아무곳에 붙여넣기를 한다.

- yy 10p

현재 라인을 한 줄 짤라내서 아무곳에 붙여넣기를 한다. (한 줄 이동)

- dd  p


현재 문서 내용을 몽땅 삭제한다. (g를 이용)

- ggdG, Gdgg


10번 라인으로 위치

- 10gg, 10G  

10번 라인부터 30번 라인까지 삭제한다.

- d30G d30gg


복사

- yw -> p, P

- yy -> p, P


hello.txt 파일을 저장


# LANG=C

# vi 

-----

안녕하세요.

좋은 아침입니다

-----


ESC -> :wq hello.txt 

ESC -> :w hello.txt  -> :q



단일창에서 hello.txt 파일 불러오기 

# vi


:e hello.txt



다중창에서 hello.txt 파일 불러오기 

# vi


:new hello.txt  -> :qa!


hello.txt 파일에 내용 추가하기

# vi

Hi...

Good Morning!!!


:w >> hello.txt -> :q!



# cat hello.txt




- /etc/DIR_COLORS 를 복사해서 vi 연습하기


# cp /etc/DIR_COLORS .

# rdate -s time.bora.net

# date

# cmp DIR_COLORS /etc/DIR_COLORS

# diff DIR_COLORS /etc/DIR_COLORS


# vi DIR_COLORS


-  서버의 설정파일을 vi 로 수정하기


# netstat -nltp | grep ssh

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2232/sshd        


# vi /etc/ssh/sshd_config 

-- /etc/ssh/sshd_config --

  :

  :

Port 22          

Port 2200

  :

  :

-- /etc/ssh/sshd_config --


x -> o -> Port 2200 추가 -> :wq -> ssh restart


# /etc/init.d/sshd restart

# netstat -nltp | grep ssh

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      8053/sshd           

tcp        0      0 0.0.0.0:2200                0.0.0.0:*                   LISTEN      8053/sshd   


검색 


- 한 라인에서 검색하기 (f)


---> 정방향 찾기

f_ <- 찾을 문자 

fr : 현재 행에서 r 을 찾아서 이동한다.  ; (다음 찾기)  , (이전 찾기)


<--- 역방향 찾기

F_ <- 찾을 문자 

Fr : 현재 행에서 r 을 찾아서 이동한다.  ; (다음 찾기)  , (이전 찾기)


- 문서 전체에서 검색하기 (/)

/찾을단어


---> 정방향 찾기 (/)

n(소) : 정방향으로 다음 찾기

N(대) : 역방향으로 다음 찾기


ex) /TERM  n  N


<--- 역방향 찾기 (?)

n(소) : 정방향으로 다음 찾기

N(대) : 역방향으로 다음 찾기


ex) ?TERM  n  N




- 두 줄 삭제

d2d 2dd dj


- 복사/붙히기 (YP)

Y, yy, 1yy, y1y  


- 현재 커서의 위치에서 두 줄 복사해서 15라인에 붙히기를 하시오.

2Y14Gp

2yy15GP


- 이동/붙히기 (dP)

- 현재 커서의 위치에서 두 줄 삭제하고 15라인에 붙히기를 하면 이동된다.

2dd15GP


- 블럭잡기

v(소) : 문자 단위

V(대) : 라인 단위

^v    : 행 단위


- 한 줄 복사/붙히기

Vy10GP

 

- 한 줄 이동/붙히기

Vd20GP


- 세 단어 복사/붙히기

v3Wy10GP


- 3 행의 한 단어 블럭 삭제

^ve3jd


- 탭 한 칸 삽입

V>


- 탭 열 칸 삽입

V10>





c^ : 현재 커서에서 왼쪽을 삭제하고 입력 상태로 변경한다.

c$, C : 현재 커서에서 오른쪽을 삭제하고 입력 상태로 변경한다.

s, cc : 한 줄을 삭제하고 입력 상태로 변경한다.


문서 전체를 모두 삭제한다.

ggdG, 1GdG, Gd1G, G1dG, Gdgg



o 단어 치환

형식 : :범위s/찾을단어/바꿀단어/옵션


- 전체 문서에서 tty를 TTY 로 변경한다.

:%s/tty/TTY/g


- 1 라인부터 30 라인까지 tty를 TTY 로 변경한다.

:1,30s/tty/TTY


- 현재 라인에 tty를 TTY 로 변경한다.

:s/tty/TTY


- 범위 지정을 이용해서 복사나 이동 삭제를 할 수 있다.

:범위 키워드 라인번호


:6,9 del

:6,9 copy 0

:6,9 move 0


- 전체 문서를 삭제한다.

:% del  or :%d



- 현재 행의 첫 번째 TERM을 term 으로 변경한다.

:s/TERM/term


- 현재 행의 모든 TERM을 term 으로 변경한다.

:s/TERM/term/g



- 현재 행의 모든 TERM을 term 으로 확인하면서 변경한다.

:s/TERM/term/gc


- 전체 문서에서 TERM을 term 으로 확인하면서 변경한다.

:%s/TERM/term/gc


- 블럭이 지정되어 있는 곳의 모든 TERM을 term 으로 변경한다.

V 를 눌러서 블럭을 지정한 후 : 를 입력한다.

:'<,'>s/TERM/term/g



- 다중창

:new 

:new /etc/passwd 

:new /etc/fstab


Ctrl + w + w : 창 이동


Ctrl + w + j : 아래로 이동 

Ctrl + w + k : 위로 이동 


2 + Ctrl + w + k  : 두 칸 위로 이동 

Ctrl + w + 2 + k  : 두 칸 위로 이동 


Ctrl + w + 5 + +  : 창을 5 칸 늘린다.


^w_  : 커서가 있는 창을 최대로 늘린다.

^w=  : 창을 모두 동일하게 한다.



:qa! : 여러개의 창을 저장하지 않고 종료한다.




~  : 대/소 문자를 전환한다.

10~



r바꿀문자 : 


R : 수정모드

<- : 수정했던 것을 복구하는 키


^a : 1 증가

^x : 1 감소



:!명령어실행


:!ls -ld /   <-- /bin/ls 실행

:!bash       <-- /bin/bash

:!sh         <-- /bin/bash



/

?

*

f

F


보안툴 설치

다운로드 : http://sourceforge.net/projects/sentrytools/

파일명 : portsentry-1.2.tar.gz


- 파일을 압축해제 하고 디렉토리로 이동한다.

# tar xzf portsentry-1.2.tar.gz 

# cd portsentry_beta


# vi ~/.vimrc

-- ~/.vimrc --

  :

set fdm=marker

-- ~/.vimrc --


# vi portsentry.c

-- portsentry.c --

  :

  :                /main

int                /{ v]}zf n v]}zf n 

main (int argc, char *argv[])

{ /*{{{*/  <-- ]}       v]}zf  zo zc

  :

  :

} /*}}}*/  <-- [{

-- portsentry.c --



- 도움말에 관련된 내용을 확인할 때 사용한다.


:help zf 

:help D


F1 

:set mouse=a   vi 에서 마우스 활성화 하기

:set mouse=    vi 에서 마우스 비활성화 하기


|....|

 ~~~~

  ^] --> ^t



o map 기능 사용하기


<Esc>                  ESC 키

<CR>                   엔터키 (Carriaga retrun)

<C-A>                  Ctrl+A

<A-A>                  Art+A

<S-A>                 Shift+A

<F1>                   F1키

<Home>                Home 키

<End>                 End 키




o vi 에서 F2 번의 기능키를 등록한다.


map <F2> :w<CR> :!gcc -o %< % <CR> ;  ./%< <CR>


vi 파일명  -> 현재 디렉토리에 .파일명.swp 파일이 생성된다.


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

LAB> vi 에서 swap 파일이 생겼을 때 복구하는 방법


o swap 파일의 문제점


*** 웹페이지에서 swap 파일은 보안상 문제가 발생될 수 있으므로  ***

*** 홈페이지 운영시 웹페이지가 있는 디렉토리에서 swap 파일이  ***

*** 있는지 find 명령어로 반드시 점검해야 한다. ***

*** 사용법 : find <디렉토리명> -name "swap 파일명" 옵션


swap 파일의 형식 : .파일명.swp


# vi test.txt

-- test.txt --

  :

  :


:!ls -l .test.txt.swp

:wq

-- test.txt --


-rw------- 1 root root 12288 Oct 24 01:44 .test.txt.swp


# ls -l test.txt 

-rw-r--r-- 1 root root 73 Oct 24 01:45 test.txt


- swp 파일이 없다

# ls -l .test.txt.swp

ls: .test.txt.swp: No such file or directory


# vi test.txt

E325: ATTENTION

Found a swap file by the name ".test.txt.swp"

          owned by: root   dated: Fri Oct 24 01:48:40 2014

         file name: ~root/test.txt

          modified: YES

         user name: root   host name: localhost.localdomain

        process ID: 14265

While opening file "test.txt"

             dated: Fri Oct 24 01:45:18 2014


(1) Another program may be editing the same file.

    If this is the case, be careful not to end up with two

    different instances of the same file when making changes.

    Quit, or continue with caution.


(2) An edit session for this file crashed.

    If this is the case, use ":recover" or "vim -r test.txt"

    to recover the changes (see ":help recovery").

    If you did this already, delete the swap file ".test.txt.swp"

    to avoid this message.


Swap file ".test.txt.swp" already exists!

[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:


r -> :w -> rm -f .test.txt.swp 

     ~~~

     1. 저장 O : :wq -> swap 파일을 삭제

     2. 저장 X : :q! -> swap 파일을 삭제

     만약에 swap 파일을 삭제하지 않고 다시 test.txt 파일을 열면

     .test.swo 파일이 만들어진다.

     -rw-r--r-- 1 root root 12288 Oct 24 01:59 .test.txt.swn

     -rw-r--r-- 1 root root 12288 Oct 24 01:58 .test.txt.swo

     -rw-r--r-- 1 root root 12288 Oct 24 01:55 .test.txt.swp


# find -name "*.sw*" -ls

575459   16 -rw-r--r--   1 root     root        12288 Oct 24 01:55 ./.test.txt.swp

575517   16 -rw-r--r--   1 root     root        12288 Oct 24 01:58 ./.test.txt.swo


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


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

[CentOS] 13. 사용자관리  (0) 2016.07.10
[CentOS] 12. HDD 추가하기  (0) 2016.07.10
[CentOS] 10-2. suidtest  (0) 2016.07.10
[CentOS] 10-1. suidtest  (0) 2016.07.10
[CentOS] 9. 환경변수 테스트  (0) 2016.07.10

# ls -l /dev/sda

brw-r----- 1 root disk 8, 0 Jul 10 08:50 /dev/sda

# useradd fdiskuser

# su - fdiskuser

$ id

uid=521(fdiskuser) gid=521(fdiskuser) groups=521(fdiskuser)

$ ls -l /sbin/fdisk

-rwxr-xr-x 1 root root 96276 Feb 23  2012 /sbin/fdisk

$ fdisk 

-bash: fdisk: command not found

$ echo $PATH

/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home1/fdiskuser/bin

$ PATH=$PATH:/sbin

$ echo $PATH

/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home1/fdiskuser/bin:/sbin

[fdiskuser@localhost ~]$ fdisk 


Usage: fdisk [-l] [-b SSZ] [-u] device

E.g.: fdisk /dev/hda  (for the first IDE disk)

  or: fdisk /dev/sdc  (for the third SCSI disk)

  or: fdisk /dev/eda  (for the first PS/2 ESDI drive)

  or: fdisk /dev/rd/c0d0  or: fdisk /dev/ida/c0d0  (for RAID devices)

  ...

$ fdisk -l /dev/sda

Cannot open /dev/sda

$ exit

# chmod u+s /sbin/fdisk

# ls -l /sbin/fdisk 

-rwsr-xr-x 1 root root 96276 Feb 23  2012 /sbin/fdisk

# su - fdiskuser


$ id

uid=521(fdiskuser) gid=521(fdiskuser) groups=521(fdiskuser)

$ /sbin/fdisk -l /dev/sda


Disk /dev/sda: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1          13      104391   83  Linux

/dev/sda2              14         268     2048287+  83  Linux

/dev/sda3             269         523     2048287+  83  Linux

/dev/sda4             524        1044     4184932+   5  Extended

/dev/sda5             524         587      514048+  83  Linux

/dev/sda6             588         815     1831378+  83  Linux

/dev/sda7             816        1044     1839411   83  Linux



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

[CentOS] 12. HDD 추가하기  (0) 2016.07.10
[CentOS] 11. vi 편집  (0) 2016.07.10
[CentOS] 10-1. suidtest  (0) 2016.07.10
[CentOS] 9. 환경변수 테스트  (0) 2016.07.10
[CentOS] 8. 권한연습  (0) 2016.07.10


# ls -l /etc/shadow

-r-------- 1 root root 2158 Jul 15 21:15 /etc/shadow

# ls -l /usr/bin/head 

-rwxr-xr-x 1 root root 29212 Mar 21  2012 /usr/bin/head

# useradd headuser

# su - headuser

$ head /etc/shadow

head: cannot open `/etc/shadow' for reading: Permission denied

$ exit

# chmod u+s /usr/bin/head 

# ls -l /usr/bin/head 

-rwsr-xr-x 1 root root 29212 Mar 21  2012 /usr/bin/head

# su - headuser

$ head /etc/shadow

root:$6$nmLBZVkD$pstH .../:16626:0:99999:7

  :

  :

$ exit

# echo 1234 | passwd --stdin headuser

# tail -1 /etc/shadow

headuser:$6$.xKuWGln$6U...:16631:0:99999:7:::

# su - headuser


$ passwd

Changing password for user headuser.

Changing password for headuser

(current) UNIX password: 

passwd: Authentication token manipulation error

$ !!

passwd

Changing password for user headuser.

Changing password for headuser

(current) UNIX password:   <-- 1234 입력

New UNIX password: 

Retype new UNIX password: 

passwd: all authentication tokens updated successfully.

$ exit


# tail -1 /etc/shadow

headuser:$6$CD2VyJWC$NbYm08fP...:16631:0:99999:7:::

# ls -l `which passwd`

-rwsr-xr-x 1 root root 23420 Aug 11  2010 /usr/bin/passwd



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

[CentOS] 11. vi 편집  (0) 2016.07.10
[CentOS] 10-2. suidtest  (0) 2016.07.10
[CentOS] 9. 환경변수 테스트  (0) 2016.07.10
[CentOS] 8. 권한연습  (0) 2016.07.10
[CentOS] 7-2. 리눅스 퍼미션  (0) 2016.07.10

# echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

# su fdiskuser

$ echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

$ fdisk -l /dev/sda


Disk /dev/sda: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1          13      104391   83  Linux

/dev/sda2              14         268     2048287+  83  Linux

/dev/sda3             269         523     2048287+  83  Linux

/dev/sda4             524        1044     4184932+   5  Extended

/dev/sda5             524         587      514048+  83  Linux

/dev/sda6             588         815     1831378+  83  Linux

/dev/sda7             816        1044     1839411   83  Linux

$ exit


# echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

# su - fdiskuser

$ echo $PATH

/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home1/fdiskuser/bin

$ fdisk -l /dev/sda

-bash: fdisk: command not found



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

[CentOS] 10-2. suidtest  (0) 2016.07.10
[CentOS] 10-1. suidtest  (0) 2016.07.10
[CentOS] 8. 권한연습  (0) 2016.07.10
[CentOS] 7-2. 리눅스 퍼미션  (0) 2016.07.10
[CentOS] 중간 정리  (0) 2016.07.06



# touch a.txt

# ls -l a.txt 

-rw-r--r-- 1 root root 0 Sep  5 11:06 a.txt


# chmod --help

chmod [OPTION]... MODE[,MODE]... FILE...

  :

-rw-r--r--  -> -rwxrw-r-x 

# chmod u+x,g+w,o+x  a.txt


-rwxrw-r-x  -> ---x-----x  

# chmod u-rw,g-rw,o-r a.txt


---x-----x  -> -r-xr-x-wx 

# chmod u+r,g+rx,o+w a.txt


-r-xr-x-wx  -> --w--w-r--

# chmod u=w,g=w,o=r a.txt

      or

# chmod ug=w,o=r a.txt


--w--w-r--  -> -r-xr-x--x

# chmod ug=rx,o=x a.txt

        or

# chmod ugo=rx,o-r a.txt

        or

# chmod a=rx,o-r a.txt

        or

# chmod a=x,ug+r a.txt


ugoa+-=rwx,


----------

# chmod a= a.txt


아래 권한들을 맞추기

# ls -l /etc/shadow (400)

-r-------- 1 root abc 1284 Sep  5 09:28 /etc/shadow


# ls -l /bin/bash (755)

-rwxr-xr-x 1 root root 735804 Jul 22  2011 /bin/bash


# ls -l /dev/sda1 (640)

brw-r----- 1 root disk 8, 1 Sep  4 09:44 /dev/sda1


# ls -ld /etc (755)

drwxr-xr-x 81 root root 4096 Sep  5 09:28 /etc



- 특수 권한

[root@localhost ~]# ls -l a.txt 

---------- 1 root root 0 Sep  5 11:06 a.txt

[root@localhost ~]# chmod ug+s,o+t a.txt 

[root@localhost ~]# ls -l a.txt 

---S--S--T 1 root root 0 Sep  5 11:06 a.txt

[root@localhost ~]# chmod u+x a.txt 

[root@localhost ~]# ls -l a.txt 

---s--S--T 1 root root 0 Sep  5 11:06 a.txt

[root@localhost ~]# chmod g+x a.txt 

[root@localhost ~]# ls -l a.txt 

---s--s--T 1 root root 0 Sep  5 11:06 a.txt

[root@localhost ~]# chmod o+x a.txt -v

mode of `a.txt' changed to 7111 (--s--s--t)



    rwsr-xr-x


권한을 변경할 수 있는가 ?

권한에 대한 의미를 파악할 수 있는가 ?

Set-uid, Set-gid, sticky bit 의 의미를 파악할 수 있는가 ?

r(읽기) 권한의 의미를 파악할 수 있는가 ?

w(쓰기) 권한의 의미를 파악할 수 있는가 ?

x(실행) 권한의 의미를 파악할 수 있는가 ?


find [디렉토리]... -옵션 값 ...


# find /bin -name bash

# find /bin -perm 755 

# find /bin -perm 4755 

# find /bin /usr/bin /usr/sbin -perm -4000 -ls



- set-uid 의 비밀

# grep ^user1 /etc/shadow

user1:$6$/8mkpuL.$x7FMVTxlCoSCx6.ktqDFEY1k ...

# su - user1

$ passwd

Changing password for user user1.

Changing password for user1

(current) UNIX password: 

New UNIX password: 

Retype new UNIX password: 

passwd: all authentication tokens updated successfully.

$ exit

# grep ^user1 /etc/shadow

user1:$6$DIE6HW8T$tkyiS7a0qm3TJ.4l41G28oL ...


# ls -l /etc/shadow

-r-------- 1 root root 1348 Sep  5 13:00 /etc/shadow


# ls -l /usr/bin/passwd 

-rwsr-xr-x 1 root root 23420 Aug 11  2010 /usr/bin/passwd



- sticky bit 디렉토리 연습

- sticky bit가 걸려있는 디렉토리는 자신이 만든 파일은 자신만이 지울 수 있다.

[root@localhost ~]# chmod o-t /tmp

[root@localhost ~]# ls -ld /tmp

drwxrwxrwx 5 root root 4096 Sep  5 11:26 /tmp

[root@localhost ~]# touch /tmp/root.txt

[root@localhost ~]# ls -l /tmp/root.txt 

-rw-r--r-- 1 root root 0 Sep  5 13:10 /tmp/root.txt


- 일반 유저 user1이 root 가 생성한 파일을 삭제할 수 있다.

[root@localhost ~]# su - user1

[user1@localhost ~]$ rm -fv /tmp/root.txt 

removed `/tmp/root.txt'

[user1@localhost ~]$ ls -l /tmp/root.txt

ls: /tmp/root.txt: No such file or directory

[user1@localhost ~]$ exit

logout


- 다시 원래의 권한으로 변경하고 파일을 다시 생성한다.

[root@localhost ~]# chmod o+t /tmp/

[root@localhost ~]# touch /tmp/root2.txt

[root@localhost ~]# ls -ld /tmp/ 

drwxrwxrwt 5 root root 4096 Sep  5 13:12 /tmp/

[root@localhost ~]# su - user1

[user1@localhost ~]$ ls -l /tmp/root2.txt

-rw-r--r-- 1 root root 0 Sep  5 13:12 /tmp/root2.txt


- sticky bit가 디렉토리에 걸려있음로 삭제가 안된다.

[user1@localhost ~]$ rm -fv /tmp/root2.txt 

rm: cannot remove `/tmp/root2.txt': Operation not permitted

[user1@localhost ~]$ exit



- 잘못된 디렉토리 때문에 파일을 일반유저가 수정할 수 있는 경우

[root@localhost ~]# touch /tmp/root2.txt

[root@localhost ~]# chmod 777 /tmp/

[root@localhost ~]# ls -ld /tmp/

drwxrwxrwx 5 root root 4096 Sep  5 13:31 /tmp/

[root@localhost ~]# ls -ld /tmp/root2.txt 

-rw-r--r-- 1 root root 3 Sep  5 13:31 /tmp/root2.txt

                      ~~~

[root@localhost ~]# su - user1

[user1@localhost ~]$ vi /tmp/root2.txt 

 ....


:w!


[user1@localhost ~]$ ll /tmp/root2.txt 

-rw-r--r-- 1 user1 user1 20 Sep  5 13:34 /tmp/root2.txt

                         ~~~


vi 에서 저장시 강제로 저장한다.   



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

[CentOS] 10-1. suidtest  (0) 2016.07.10
[CentOS] 9. 환경변수 테스트  (0) 2016.07.10
[CentOS] 7-2. 리눅스 퍼미션  (0) 2016.07.10
[CentOS] 중간 정리  (0) 2016.07.06
[CentOS] 7-1. 리눅스퍼미션  (0) 2016.07.02

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

## 주제 : 퍼미션                           ##

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


여러사람이 사용하는 멀티유저 운영체제인 리눅스는 보안상의 이유로 각 파일마다 

접근권한이 설정되어 있다.  이를 퍼미션이라고 한다.

예를들어 다른 사람이 자신의 파일을 읽을 수 있도록 허용할 수도 있고 거부할 수도 있다.

또한 자신의 파일에 다른 내용을 기록하게 허용할 수도 있고 거부할 수도 있다.

이들 권한들을 이용하여 각 파일과 디렉토리들을 다른 사람들과 공유하거나 아니면 개인적인 목적으로 사용할 수 있다. 

리눅스에서 사용자는 기본적으로 최소 하나의 그룹에 포함되어 있고 하나 이상의 그룹에 속할 수도 있다.

         

파일(디렉토리) 생성시 디폴트로 설정되는 권한

- 파일 권한은 umask 에 기본 설정된 값에 따라서 권한이 만들어진다.

- 명령어 : umask (내부명령어)


퍼미션 변경 명령어 

- 명령어 : chmod (외부명령어)

- 디렉토리 위치 : /bin

- 패키지 : coreutils 


퍼미션 변경 방법 

- symbolic mode(심볼릭 모드)를 이용해서 변경(문자를 이용) 한다.

- octal mode(8진수 모드)를 이용해서 변경(숫자를 이용) 한다.



퍼미션의 3가지 구분

1. 소유자 (user)

2. 그룹 (group)

3. 다른사용자 (other)


리눅스의 퍼미션

- 퍼미션은 크게 아래처럼 읽기권한, 쓰기권한, 실행권한, 특수권한으로 되어있다. 

- 퍼미션은 아이노드에 정보가 들어있다.


    s  s  t <-- 특수 권한

  rwxrwxrwx <-- 일반 권한

 -rw-r--r-- 1 root root 1826 Nov 18 15:07 /etc/passwd

  ~~~   ~~~

  |  ~~~ |

  |  |  other (user + group 에 속하지 않은 모든 사용자들의 권한)

  |  |  

  |  group (파일의 그룹의 권한)

  |

  user (owner 파일의 소유자의 권한)



r(Read)    : 읽기 권한

w(Write)   : 쓰기 권한 

x(eXecute) : 실행 권한 

s(Set-uid) : 특수 권한 (셋유저아이디 or 셋유아이디)

s(Set-gid) : 특수 권한 (셋그룹아이디 or 셋지아이디)

t(stickybiT) : 특수 권한 (스티키비트)


+---+-----------+-----------+-----------+

|   |  Set-UID  |  Set-GID  |Sticky-Bit |

+   +---+---+---+---+---+---+---+---+---+

|   |     s     |     s     |     t     |  <-- 특수 권한

+   +---+---+---+---+---+---+---+---+---+

|   | r | w | s | r | w | s | r | w | t |

+   +---+---+---+---+---+---+---+---+---+

|   |    user   |   group   |   other   |

+---+---+---+---+---+---+---+---+---+---+

| - | r | w | x | r | w | x | r | w | x |  <-- 일반 권한

+---+---+---+---+---+---+---+---+---+---+



octal mode를 이용한 일반 권한의 퍼미션 값

+---+---+---+---+

|   | 4 | 2 | 1 |

+---+---+---+---+

| - | r | w | x |

+---+---+---+---+

| 0 | 0 | 0 | 0 | ---

+---+---+---+---+

| 1 | 0 | 0 | 1 | --x

+---+---+---+---+

| 2 | 0 | 1 | 0 | -w-

+---+---+---+---+

| 3 | 0 | 1 | 1 | -wx

+---+---+---+---+

| 4 | 1 | 0 | 0 | r--

+---+---+---+---+

| 5 | 1 | 0 | 1 | r-x

+---+---+---+---+

| 6 | 1 | 1 | 0 | rw-

+---+---+---+---+

| 7 | 1 | 1 | 1 | rwx

+---+---+---+---+


octal mode를 이용한 특수 권한의 퍼미션 값

      0000 ~ 7777

      0 ~ 7        0 ~ 7       0 ~ 7       0 ~ 7

    |- 특수권한-|- user    -|- group   -|- other   -|

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 |  

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   | s | s | t | r | w | x | r | w | x | r | w | x |  

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- rwxrwxrwx

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | x | r | w | x | r | w | x |  

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- t rwxrwxrwt

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | x | r | w | x | r | w | t |  

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 2 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- s   set-gid 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | x | r | w | s | r | w | x |  

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 3 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- st  set-gid + sticky-bit  

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | x | r | w | s | r | w | t | 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 4 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- s   set-uid   

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | s | r | w | x | r | w | x | 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 5 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- st  set-uid + sticky-bit

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | s | r | w | x | r | w | t | 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 6 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- ss  set-uid + set-gid

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | s | r | w | s | r | w | x | 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 7 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- sst set-uid + set-gid + sticky-bit

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | s | r | w | s | r | w | t | 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

 


파일과 디렉토리에 대한 퍼미션의 의미

--------------------------------------+------------------------------------------------

             파일                     |          디렉토리 (x 권한을 같이 사용)

--------------------------------------+------------------------------------------------

r  파일의 내용을 볼 수 있는 권한      |  디렉토리의 파일 목록을 볼 수 있는 권한

--------------------------------------+------------------------------------------------

w  파일의 내용을 수정할 수 있는 권한  |  디렉토리에서 파일을 생성/삭제할 수 있는 권한

--------------------------------------+------------------------------------------------

x  파일을 실행할 수 있는 권한         |  디렉토리에 접근할 수 있는 권한 (cd 로 이동)

--------------------------------------+------------------------------------------------

setUID  실행중에 소유자의 권한으로 실행    |                   x 

--------------------------------------+------------------------------------------------

setGID  실행중에 그룹의 권한으로 실행 |   파일을 생성시 그룹의 권한으로 생성

--------------------------------------+------------------------------------------------

sticky-bit  현재는 사용하지 않는다.   |   모두 생성하지만 지울땐 소유자가 만든 파일만 삭제 

                                      |   (공용디렉토리에 사용, /tmp)

--------------------------------------+------------------------------------------------


x 권한이 들어있는 파일은 실행파일 과 디렉토리이다.

실행파일의 두 가지 종류

- 바이너리 파일(컴파일과정을 거친 파일)  (root : x 권한만 있으면 된다. 일반유저 : x 권한만 있으면 된다.) 

- 쉘스크립트 파일 (일반 텍스트 문서지만 실행 형식을 갖춘 파일)     

  (root : x 권한만 있어도 된다. 일반유저 : rx 모두 있어야 한다.)

 


심볼릭 모드를 이용해서 변경하는 방법의 예

- 문자를 이용해서 퍼미션을 변경한다.

- 허용문자 : augorwxst,=-+


-----------------------------------------------

ex)

# touch a.txt; chmod a-rwx a.txt


---------- 1 root root 0 Oct 31 17:28 a.txt


chmod u+rwx,go+rx a.txt or chmod u+w,a+rx a.txt or

chmod a+rwx,go-w a.txt or chmod a=rwx,og-w a.txt

-rwxr-xr-x (0755)  


chmod go= a.txt or chmod go-rx a.txt

-rwx------   


-rw-------   chmod u-x a.txt


-rw-r--r--   chmod go+r a.txt

-----------------------------------------------


8진수(octal) 모드를 이용해서 변경하는 방법의 예

- 숫자를 이용해서 퍼미션을 변경한다.

- 허용숫자 : 0 ~ 7

  rwx rwx

  421 421

0 --- 000 

1 --x 001

2 -w- 010

3 -wx 011

4 r-- 100

5 r-x 101

6 rw- 110

7 rwx 111


-----------------------------------------------

ex) a.txt 를 초기화 시키고 권한 변경하기

chmod 000 a.txt

---------- 1 root root 0 Oct 31 17:28 a.txt


-rwxr-xr-x  : chmod -c 755 a.txt

-rwx------  : chmod -c 700 a.txt

-rw-------  : chmod -c 600 a.txt 

-rw-r--r--  : chmod -c 644 a.txt

---x--x--x  : chmod -c 111 a.txt

-----------------------------------------------



많이 사용되는 실행파일 권한들

-rwxr-xr-x   

-rwxr-x--x   <-- 보안상 r 권한은 제거

-rwxr-x---

-rwx------

-rwx--x---


많이 사용되는 디렉토리 권한들

drwxr-xr-x   

drwxr-x--x   <-- 보안상 r 권한은 제거

drwxr-x---

drwx------

drwx--x---


많이 사용되는 파일들의 권한들 (실행파일과 디렉토리가 아닌 모든 파일들에 해당)

-rw-r--r--   

-rw-r-----

-rw-------


*** 공통점 : 소유자는 user 부분의 권한을 모두 가진다는 것이다. ***

디렉토리 : -rwx??????

일반파일(실행X) : -rw-??????

일반파일(실행X) : -r--??????

일반파일(실행O) : -rwx??????


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

LAB> Linux Box 에 기본적으로 설정된 퍼미션을 알아보자


-- LAB 순서 --

1. /etc/shadow 파일 내용 보기

2. /root 디렉토리로 이동하기

-- LAB 순서 --


1. cat /etc/shadow 

- /etc/shadow 파일 내용을 관리자(root) 와 일반유저(linux)가 명령어 cat head tail 로 살펴보자.


- 사용자를 확인한다.

~ # id

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:system_r:unconfined_t:s0-s0:c0.c1023


- 권한을 확인한다.

~ # ls -dl /bin

-rwxr-xr-x ...

~ # ls -l /bin/cat

-rwxr-xr-x 1 root root 20776 Mar 21  2012 /bin/cat

~ # ls -l /etc/shadow

-r-------- 1 root root 1222 Nov 18 13:18 /etc/shadow

~ # ls -l /usr/bin/head 

-rwxr-xr-x 1 root root 31788 Jul 22  2011 /usr/bin/head

~ # ls -l /usr/bin/tail

-rwxr-xr-x 1 root root 42956 Jul 22  2011 /usr/bin/tail


- 파일의 내용을 확인한다.

~ # cat /etc/shadow

root:$1$gmWxQmiB$CvtOiLu.oflCfdDQQLXdA1:15955:0:99999:7:::

bin:*:15955:0:99999:7:::

daemon:*:15955:0:99999:7:::

adm:*:15955:0:99999:7:::

lp:*:15955:0:99999:7:::

sync:*:15955:0:99999:7:::

shutdown:*:15955:0:99999:7:::

  :

  :


~ # head -2 /etc/shadow

root:$1$gmWxQmiB$CvtOiLu.oflCfdDQQLXdA1:15955:0:99999:7:::

bin:*:15955:0:99999:7:::

~ # tail -2 /etc/shadow

test3:!!:16268:0:99999:7:::

linux:!!:16263:0:99999:7:::


- 일반유저 linux 에서 파일의 내용을 확인한다.

~ # useradd linux

~ # su - linux


- 사용자를 확인한다.

~ $ id

uid=503(linux) gid=503(linux) groups=503(linux) context=root:system_r:unconfined_t:s0-s0:c0.c1023

~ $ cat /etc/shadow

cat: /etc/shadow: Permission denied

~ $ head /etc/shadow

head: cannot open `/etc/shadow' for reading: Permission denied

~ $ tail /etc/shadow

tail: cannot open `/etc/shadow' for reading: Permission denied

~ $ more  /etc/shadow

/etc/shadow: Permission denied


2. /root 디렉토리로 이동하기

- /root 디렉토리로 관리자(root) 와 일반유저(linux)가 명령어 cd 로 이동해보자.


- 권한을 확인한다.

# ls -ld /root

drwxr-x--- 8 root root 4096 Jul 13 03:07 /root


# ls -ld /tmp

drwxrwxrwt 7 root root 1024 Oct 23 16:47 /tmp


- 디렉토리로 이동한다.

# cd /tmp

# cd /root

# su - linux


- 사용자를 확인한다.

$ id

uid=503(linux) gid=503(linux) groups=503(linux) context=root:system_r:unconfined_t:s0-s0:c0.c1023


- 디렉토리로 이동한다.

~ $ ls -ld /root

drwxr-x--- 8 root root 4096 Jul 13 02:56 /root

$ cd /tmp

$ pwd

$ cd /root

-bash: cd: /root: Permission denied



$ cat /etc/shadow

cat: /etc/shadow: Permission denied


$ ls -ld /

drwxr-xr-x 23 root root 4096 Oct 20 10:16 /

$ ls -ld /bin

drwxr-xr-x 2 root root 4096 Oct 17 12:17 /bin

$ ls -l /bin/cat

-rwxr-xr-x 1 root root 23260 Jul 22  2011 /bin/cat

$ ls -ld /etc

drwxr-xr-x 82 root root 4096 Oct 23 14:37 /etc

$ ls -l /etc/shadow

-r-------- 1 root root 970 Oct 20 11:39 /etc/shadow

$ ls -l /etc/passwd

-rw-r--r-- 1 root root 1595 Oct 20 11:39 /etc/passwd

$ cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

  :

  :


- /usr/local/bin 디렉토리는 일반유저가 들어갈 수 있는 권한이 있다.

$ cd /usr/local/bin

$ pwd

/usr/local/bin


$ ls -ld /usr

drwxr-xr-x 15 root root 4096 Oct 17 10:51 /usr

         ~

$ ls -ld /usr/local

drwxr-xr-x 11 root root 4096 Oct 17 10:50 /usr/local

         ~

$ ls -ld /usr/local/bin

drwxr-xr-x 2 root root 4096 May 11  2011 /usr/local/bin

         ~



- /var/spool/cron 디렉토리는 일반유저가 들어갈 수 있는 권한이 없다.

$ cd /var/spool/cron

-bash: cd: /var/spool/cron/: Permission denied


$ ls -ld /var

drwxr-xr-x 22 root root 4096 Oct 17 11:37 /var

         ~

$ ls -ld /var/spool/

drwxr-xr-x 10 root root 4096 Oct 17 10:52 /var/spool

         ~

$ ls -ld /var/spool/cron

drwx------ 2 root root 4096 Feb 23  2012 /var/spool/cron

         ~


- /tmp 디렉토리의 파일 목록을 확인할 수 있다.

$ ls /tmp

lost+found  mc-root  TEST


$ ls -l /bin/ls

-rwxr-xr-x 1 root root 95116 Jul 22  2011 /bin/ls

         ~

$ ls -ld /tmp

drwxrwxrwt 7 root root 1024 Oct 23 19:11 /tmp

         ~


$ df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda1              2847720    258048   2442680  10% /

/dev/sda3               388693     10307    358305   3% /home

/dev/sda6               956980    136728    770856  16% /var

/dev/sda7               482214     10552    446763   3% /tmp

/dev/sda5              1898468   1274028    526448  71% /usr

/dev/sda2               101105     11596     84288  13% /boot

tmpfs                   127492         0    127492   0% /dev/shm


$ ls -l /bin/df

-rwxr-xr-x 1 root root 44744 Jul 22  2011 /bin/df



- 디렉토리의 r 권한 테스트

# ls -ld /tmp

drwxrwxrwt 7 root root 1024 Oct 23 19:11 /tmp

       ~

$ ls /tmp

lost+found  mc-root  TEST


# chmod o-r /tmp 

# ls -ld /tmp

drwxrwx-wt 7 root root 1024 Oct 23 19:11 /tmp

       ~

$ ls /tmp

ls: /tmp: Permission denied


- 쓰기 권한 연습


$ cd

$ pwd

/home/linux

$ ls -ld 

drwx------ 3 linux linux 1024 Oct 23 19:31 .

  ~

$ touch a.txt

$ ls -l a.txt 

-rw-rw-r-- 1 linux linux 0 Oct 23 19:31 a.txt

$ echo 1234 > a.txt

$ ls -l a.txt 

-rw-rw-r-- 1 linux linux 5 Oct 23 19:31 a.txt

$ cat a.txt 

1234


- /etc/passwd 파일을 수정할 수 없다.

$ echo 1234 >> /etc/passwd

-bash: /etc/passwd: Permission denied

$ ls -ld /etc

drwxr-xr-x 82 root root 4096 Oct 23 19:11 /etc

        ~

$ ls -l /etc/passwd

-rw-r--r-- 1 root root 1595 Oct 20 11:39 /etc/passwd

        ~


파일이 쓰기 권한이 없어도 파일이 속한 디렉토리에 쓰기 권한이 있다면 

일반유저는 파일을 수정할 수 있다. 

파일보다 파일이 속한 디렉토리가 우선하기 때문이다.

# mkdir -m 707 /tmp/test

# umask 022

# echo 1234 > /tmp/test/a.txt


$ ls -ld /tmp/test

drwxr-xrwx 82 root root 4096 Oct 23 19:11 /tmp/test

$ ls -l /tmp/test/a.txt

-rw-r--r-- 1 root root 1595 Oct 20 11:39 /tmp/test/a.txt

$ cd /tmp/test

$ cp a.txt b.txt

$ rm -f a.txt

$ mv b.txt a.txt

$ echo hi >> a.txt


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



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

LAB> 웹서버 문서의 권한을 테스트해보자.


# apachectl stop

# yum -y install httpd

# /etc/init.d/httpd start

# cd /var/www/html

# vi index.html

-- index.html --

Hello My Server!!!

-- index.html --


# ifconfig eth1

eth1      Link encap:Ethernet  HWaddr 08:00:27:AD:8E:F4  

          inet addr:192.168.56.101  Bcast:192.168.56.255  Mask:255.255.255.0


# iptables -F


브라우저로 접속 : httpd://192.168.56.101


- 일반 유저가 파일의 내용을 수정!!!

# su - apache

$ cd /var/www/html

$ ls -ld 

drwxr-xr-x 2 root root 4096 Oct 23 19:46 .

        ~ <-- root 사용자 아닌 모든 유저는 파일을 생성할 수 없다.

$ ls -l

total 8

-rw-r--r-- 1 root root 19 Oct 23 19:46 index.html

        ~ <-- root 사용자 아닌 모든 유저는 파일을 수정할 수 없다.


$ cat index.html 

Hello My Server!!!

$ vi index.html      <-- 파일의 내용을 수정할 수 없다.

         

$ touch index2.html  <-- 파일을 생성할 수 없다.

touch: cannot touch `index2.html': Permission denied


$ exit

# pwd

/var/www/html

# ls -l index.html 

-rw-r--r-- 1 root root 19 Oct 23 19:46 index.html

# chmod o+w index.html 

# ls -l

total 8

-rw-r--rw- 1 root root 19 Oct 23 19:46 index.html

        ~

# su - apache

$ cd /var/www/html

$ vi index.html       <-- 파일의 내용을 수정할 수 있다.

-- index.html --

hahaha!!!

-- index.html --


- 디렉토리가 쓰기 권한이 있고 파일이 쓰기 권한이 없을 때도 변경할 수 있는가 ?

# chmod o+w .

# ls -ld 

drwxr-xrwx 2 root root 4096 Oct 23 19:46 .


# chmod 644 index.html 

# ls -l

total 8

-rw-r--r-- 1 root root 22 Oct 23 19:56 index.html


- 저장시 :w 하면 저장이 안되고 :w! 해야 저장할 수 있다. 

  파일이 w 권한이 없어도 저장되는 이유는 디렉토리의 권한이 파일보다 

  우선순위를 먼저 가지기 때문이다.

$ vi index.html

-- index.html --

Hello My Server!!! ^^*;;

-- index.html --


$ ls -l index.html 

-rw-r--r-- 1 linux linux 25 Oct 23 20:10 index.html


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




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

LAB> chmod 를 이용한 파일의 권한을 변경해보자.


-- LAB 순서 --

1. symbolic mode 로 퍼미션 변경

2. octal mode 로 퍼미션 변경

-- LAB 순서 --


1. symbolic mode 로 퍼미션 변경

- /bin/mv 명령어를 자신의 디렉토리에 복사한 후 symbolic mode 로 퍼미션을 변경해보자.

# cp /bin/mv .

# ls -l mv

-rwxr-xr-x 1 root root 78252 Nov 18 16:12 mv

# chmod -c u-r mv

mode of `mv' changed to 0355 (-wxr-xr-x)

# chmod -c o-r mv

mode of `mv' changed to 0351 (-wxr-x--x)

# chmod a-x mv -c

mode of `mv' changed to 0240 (-w-r-----)



2. octal mode 로 퍼미션 변경

- 복사된 /bin/mv 명령어의 퍼미션을 octal mode 로 변경해보자.

# cp /bin/mv .

# chmod -c 000 mv 

mode of `mv' changed to 0000 (---------)

# chmod -c 700 mv

mode of `mv' changed to 0700 (rwx------)

# chmod -c 711 mv

mode of `mv' changed to 0711 (rwx--x--x)

# chmod -v 711 mv

mode of `mv' retained as 0711 (rwx--x--x)

~ # chmod -c 711 mv

# chmod -c 710 mv

mode of `mv' changed to 0710 (rwx--x---)

# chmod 1777 mv

# chmod -v 1777 mv

mode of `mv' retained as 1777 (rwxrwxrwt)

# chmod -c 2755 mv

mode of `mv' changed to 2755 (rwxr-sr-x)

~ # chmod -c 4755 mv

mode of `mv' changed to 4755 (rwsr-xr-x)


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


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

LAB> /tmp 디렉토리 테스트 


참고 : sticky-bit(w권한포함) 권한이 있는 디렉토리는 누구나 파일을 생성할 수 

있지만 파일을 삭제할 때는 자기가 만든 파일만 삭제할 수 있다.

남이 생성한 파일에 대해서는 삭제할 수 없다.


리눅스에서 sticky-bit 가 걸려있는 디렉토리를 검색한다.

# find / -perm -1000 -ls 2> /dev/null 1> /dev/null

# find / -perm -1000 -ls 2> /dev/null 1> /dev/null

# find / -perm -1000 -ls 2> /dev/null 1>&2

# find / -perm -1000 -ls 1> /dev/null 2>&1

# find / -perm -1000 -ls 1> /dev/null 2> /dev/null

# find / -perm -1000 -ls > /dev/null 2> /dev/null


[root@localhost ~]# ls -ld /tmp

drwxrwxrwt 7 root root 1024 Oct 24 02:55 /tmp


[root@localhost ~]# su - user1

[user1@localhost ~]$ cd /tmp


[root@localhost ~]# su - linux

[linux@localhost ~]$ cd /tmp


[user1@localhost tmp]$ touch user1.txt

[user1@localhost tmp]$ ls -l user1.txt 

-rw-rw-r-- 1 user1 user1 0 Oct 24 02:54 user1.txt


[linux@localhost tmp]$ touch linux.txt

[linux@localhost tmp]$ ls -l linux.txt 

-rw-rw-r-- 1 linux linux 0 Oct 24 02:54 linux.txt


[user1@localhost tmp]$ rm -f linux.txt 

rm: cannot remove `linux.txt': Operation not permitted


[linux@localhost tmp]$ rm -f user1.txt 

rm: cannot remove `user1.txt': Operation not permitted


[user1@localhost tmp]$ rm -fv user1.txt 

removed `user1.txt'

[user1@localhost tmp]$ ls -l user1.txt

ls: user1.txt: No such file or directory


[linux@localhost tmp]$ rm -f linux.txt 

[linux@localhost tmp]$ ls -l linux.txt

ls: linux.txt: No such file or directory


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


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

LAB> Set-UID 테스트1

일반유저가 실행파일을 실행시 자신의 권한으로 프로그램을 실행하게 되는데

Set-uid 가 걸린 실행파일을 실행할 때는 자신의 권한이 아니라 실행파일의 소유자의

권한으로 실행하게 된다.


좋은 예가 일반유저가 자신의 비밀번호를 저장하는 경우이다. 

이 경우 일반유저는 /etc/shadow 파일에 저장할 수 있는 권한이 없지만

/usr/bin/passwd 파일이 set-uid 권한이 있기 때문에 /etc/shadow 파일에

자신의 비밀번호를 저장할 수 있는 것이다.


UID, GID, EUID, EUGID



[root@localhost html]# ls -l /usr/bin/passwd 

-rwsr-xr-x 1 root root 23420  8월 11  2010 /usr/bin/passwd

[root@localhost html]# ls -l /etc/shadow

-r-------- 1 root root 2441  3월 17 19:09 /etc/shadow

[root@localhost html]# useradd testpasswd 

[root@localhost html]# tail -1 /etc/shadow

testpasswd:!!:16511:0:99999:7:::

[root@localhost html]# echo 1234 | passwd --stdtn testpasswd

passwd: bad argument --stdtn: unknown option

[root@localhost html]# echo 1234 | passwd --stdin testpasswd

Changing password for user testpasswd.

passwd: all authentication tokens updated successfully.

[root@localhost html]# tail -1 /etc/shadow

testpasswd:$6$WS8.iV/N$8ZFwt5......:16511:0:99999:7:::

[root@localhost html]# su - testpasswd

[testpasswd@localhost ~]$ passwd

Changing password for user testpasswd.

Changing password for testpasswd

(current) UNIX password: 

New UNIX password: 

Retype new UNIX password: 

passwd: all authentication tokens updated successfully.

[testpasswd@localhost ~]$ exit

[root@localhost html]# tail -1 /etc/shadow

testpasswd:$6$ozop05dF$tJTxLFZ9JCN...:16511:0:99999:7:::

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


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

LAB> Set-UID 테스트2


# cd /tmp

# vi setuidtest.c

-- setuidtest.c --

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>


int main()

{

  int uid, gid, euid, egid;


  // EUID : Set-UID 가 걸린 UID 

  // GUID : Set-GID 가 걸린 GID

  // set-uid, set-gid 가 설정이 되어있지 않다면 EUID, EGID 에는 자신의 

  // UID 와 GID 값이 들어간다.


  uid = getuid();    // 현재 프로세스를 실행한 사용자의 UID 를 구한다.

  gid = getgid();    // 현재 프로세스를 실행한 사용자의 GID 를 구한다.

  euid = geteuid();  // 현재 프로세스에 설정된 UID(EUID) 를 구한다.

  egid = getegid();  // 현재 프로세스에 설정된 GUID(EGID) 를 구한다.


  printf("uid  = %d \n" 

         "gid  = %d \n" 

         "euid = %d \n" 

         "egid = %d \n", uid, gid, euid, egid);


  return 0;

}

-- setuidtest.c --


-- 실행결과 --

# gcc -o setuidtest setuidtest.c 

# ./setuidtest


# su - user1

$ id

uid=9010(user1) gid=9010(user1) groups=9010(user1)

$ /tmp/setuidtest 

uid  = 9010 

gid  = 9010 

euid = 9010 

egid = 9010 

$ exit


# chmod u+s setuidtest

# ls -l setuidtest

-rwsr-xr-x 1 root root 5394  3월 17 20:51 setuidtest

# su - user1

$ /tmp/setuidtest 

uid  = 9010 

gid  = 9010 

euid = 0 

egid = 9010 

$ exit


# chmod g+s setuidtest

# ls -l setuidtest

-rwsr-sr-x 1 root root 5394  3월 17 20:51 setuidtest

# su - user1

$ /tmp/setuidtest 

uid  = 9010 

gid  = 9010 

euid = 0 

egid = 0 

-- 실행결과 --

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

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

LAB> Set-UID 테스트3


조건 : 전체 시스템에서 set-uid 가 걸린 것을 모두 찾는데 에러는 출력하지 말아라


# find / -perm -4000 -ls 2> /dev/null

su 

passwd

 :

 :


이 랩은 일반 유저가 cat 을 이용해서 /etc/shadow 파일을 보는 내용이다.

일반적으로 /bin/cat의 실행파일은 일반유저가 실행할 수는 있지만 

/etc/shadow 파일의 읽기 권한이 없기 때문에 /etc/shadow 파일을 볼 수 없다.

하지만 /bin/cat 의 권한을 set-uid 로 설정하면 /etc/shadow 파일을 볼 수 있다.


!!! /etc/shadow 파일을 보기위한 조건 : 

!!! 1. 권한이 set-uid 가 있어야 한다.

!!! 2. 실행파일(cat)의 소유자가 root 이어야 한다.



# ls -ld /

drwxr-xr-x 25 root root 4096 Mar 17 15:52 /

# ls -ld /bin

drwxr-xr-x 2 root root 4096 Oct 17 12:17 /bin

# ls -l /bin/cat

-rwxr-xr-x 1 root root 23260 Jul 22  2011 bin/cat

# ls -ld /etc

drwxr-xr-x 82 root root 4096 Oct 24 02:40 etc

# ls -l /etc/shadow

-r-------- 1 root root 1030 Oct 24 02:40 /etc/shadow


$ cat /etc/shadowcat: 

/etc/shadow: Permission denied


# chmod u+s /bin/cat -c

mode of `/bin/cat' changed to 4755 (rwsr-xr-x)


$ cat /etc/shadow

  :

  :

$ exit


# chown user2 /bin/cat

# ls -l /bin/cat

-rwxr-xr-x 1 user2 root 23260 Jul 22  2011 /bin/ca

# chmod u+s /bin/cat

# ls -l /bin/cat

-rwsr-xr-x 1 user2 root 23260 Jul 22  2011 /bin/ca

# su - user1

$ cat /etc/shadow

cat: /etc/shadow: Permission denied

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

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

LAB> SetGID 테스트


- 일반 파일

[root@localhost ~]# umask

0022

[root@localhost ~]# echo 1234 > /tmp/readme.txt 

[root@localhost ~]# chmod o= /tmp/readme.txt 

[root@localhost ~]# ls -l /tmp/readme.txt 

-rw-r----- 1 root root 5 Oct 24 03:35 /tmp/readme.txt

[root@localhost ~]# chmod 755 /bin/cat

[root@localhost ~]# ls -l /bin/cat

-rwxr-xr-x 1 root root 23260 Jul 22  2011 /bin/cat


- /bin/cat 은 일반유저가 실행할 때 자신의 권한으로 실행하므로 

  /tmp/readme.txt 파일은 볼 수가 없다.

[user1@localhost ~]$ cat /tmp/readme.txt 

cat: /tmp/readme.txt: Permission denied


- /bin/cat 파일을 SetGID 권한을 부여한다.

[root@localhost ~]# chmod g+s /bin/cat

[root@localhost ~]# ls -l /bin/cat

-rwxr-sr-x 1 root root 23260 Jul 22  2011 /bin/cat


- 일반유저가 /bin/cat 을 실행할 때 SetGID 권한이 설정되어 있으므로 

  /tmp/readme.txt 파일을 볼 수 있다.

[user1@localhost ~]$ cat /tmp/readme.txt 

1234


- 디렉토리


- 디렉토리에 SetGID 가 없을 경우 

- 소유자가 속해있는 그룹으로 파일이 생성된다.

[root@localhost ~]# mkdir -m 777 /tmp/test

[root@localhost ~]# ls -ld /tmp/test

drwxrwxrwx 2 root root 1024 Oct 24 03:42 /tmp/test


[user1@localhost ~]$ cd /tmp/test

[user1@localhost test]$ touch a.txt

[user1@localhost test]$ ls -l a.txt 

-rw-rw-r-- 1 user1 user1 0 Oct 24 03:43 a.txt

                   ~~~~~


- 디렉토리에 SetGID 가 있을 경우 

- 디렉토리에 설정된 그룹으로 파일이 생성된다.

[root@localhost ~]# chmod g+s /tmp/test

[root@localhost ~]# ls -ld /tmp/test

drwxrwsrwx 2 root root 1024 Oct 24 03:43 /tmp/test

     ~~

[user1@localhost test]$ touch b.txt

[user1@localhost test]$ ls -l b.txt 

-rw-rw-r-- 1 user1 root 0 Oct 24 03:44 b.txt

                   ~~~~

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


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

LAB> 권한 테스트하기


421421421

---------  0000 

r--rws--t  3471

--s--s--x  6111


rwxrwxrwt  1777

rwSr-x--T  5650

-wS-w----  4220

--S-----x  4001

--srw-rwx  4167

r-S-wS-w-  6422

rw---s--t  3611

rw---S--T  3600

rw------T  1600

r----x--t  1411

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


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

LAB> LINUX BOX 에서 특수 권한이 있는 모든 파일을 검색하기


- SUID 가 들어있는 파일들을 모두 검색한다.

# find / -perm -4000 2>/dev/null -ls


- SGID 가 들어있는 파일들을 모두 검색한다.

# find / -perm -2000 2>/dev/null -ls


- SUID 와 SGID 권한이 있는 파일들을 모두 검색한다.

# find / \( -perm -4000 -o -perm -2000 \) 2>/dev/null -ls


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


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

LAB> 읽기 권한 디렉토리 실습하기


$ ls -ld /bin

drwxr-xr-x 2 root root 4096 Oct 17 12:17 /bin

       ~~~

$ ls -ld /root

drwxr-x--- 11 root root 4096 Oct 23 23:21 /root

       ~~~

$ ls /root

ls: /root: Permission denied

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







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

LAB> 읽기, 쓰기 권한 연습하기


- 읽기권한 연습 ( read 권한을 제거 )

# cd /tmp


/tmp # echo "Hello World" > a.txt

/tmp # ls -l a.txt 

-rw-r--r-- 1 root root 12 Feb 17 22:05 a.txt

/tmp # cat a.txt 

Hello World


/tmp # echo "Hello World" > b.txt

/tmp # ls -l b.txt 

-rw-r--r-- 1 root root 12 Feb 17 22:05 b.txt

/tmp # cat b.txt 

Hello World


/tmp # chmod -c o-r a.txt

mode of `a.txt' changed to 0640 (rw-r-----)

/tmp # chmod -c o-r a.txt


- 읽기권한 연습 ( read 권한을 제거한 a.txt 파일은 일반유저가 읽을 수 없다. )

/tmp # useradd linux

/tmp # su - linux

~ $ cd /tmp 

/tmp $ cat b.txt 

Hello World

/tmp $ cat a.txt 

cat: a.txt: Permission denied


- 쓰기권한 연습 ( 일반유저가 write 권한이 없을때 )

/tmp # echo "Have a nice day" >> a.txt   <-- a.txt 에 내용을 추가한다.

/tmp # cat a.txt 

Hello World

Have a nice day

/tmp # chmod -c o+r a.txt

mode of `a.txt' changed to 0644 (rw-r--r--)


/tmp $ cat a.txt 

Hello World

Have a nice day


/tmp $ echo "^^*" >> a.txt       <-- a.txt 에 내용을 추가했지만 권한이 없어서 추가가 안된다.

-bash: a.txt: Permission denied

/tmp $ cat a.txt                 <-- a.txt를 확인하면 추가가 안된 것을 알 수 있다.

Hello World

Have a nice day


- 쓰기권한 연습 ( 일반유저가 write 권한이 있을때 )

/tmp # ls -l b.txt 

-rw-r--r-- 1 root root 28 Feb 17 22:29 a.txt

/tmp # chmod -c o+w b.txt

mode of `b.txt' changed to 0646 (rw-r--rw-)


/tmp $ cat b.txt 

Hello World


/tmp $ echo "I have a smartphone" >> b.txt   <-- b.txt 에 문자열이 추가되었다.

/tmp $ cat b.txt 

Hello World

I have a smartphone

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


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

LAB> /dev/sda 장치 파일의 읽기권한을 이용한 파티션 정보 출력하기


-----------------------------------------------------------

brw-r----- root disk /dev/sda  <-- 일반유저가 읽을 수 없다.

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

brw-r--r-- root disk /dev/sda  <-- 일반유저가 읽을 수 있다.

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

-----------------------------------------------------------


# ls -l /dev/sda

brw-r----- 1 root disk 8, 0 Nov 20 19:30 /dev/sda

# fdisk -l /dev/sda


Disk /dev/sda: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1         913     7333641   83  Linux

/dev/sda2             914        1044     1052257+  82  Linux swap / Solaris


# su - linux  <-- Other 부분에 읽기 권한이 없으므로 볼 수 없다.

$ /sbin/fdisk -l /dev/sda

Cannot open /dev/sda

$ exit


o /dev/sda 를 변경해서 보는 방법

# chmod -c o+r /dev/sda

mode of `/dev/sda' changed to 0644 (rw-r--r--)


$ /sbin/fdisk -l /dev/sda  <-- Other 에 읽기 권한이 있으므로 볼 수 있다.


Disk /dev/sda: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1         913     7333641   83  Linux

/dev/sda2             914        1044     1052257+  82  Linux swap / Solaris


o set-uid 를 변경해서 보는 방법

# chmod u+s /sbin/fdisk 

# ls -l /sbin/fdisk 

-rwsr-xr-x 1 root root 96276 Feb 23  2012 /sbin/fdisk

# su - user1


$ /sbin/fdisk -l /dev/sda


Disk /dev/sda: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1          13      104391   83  Linux

/dev/sda2              14        1044     8281507+  8e  Linux LVM

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


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

LAB> 스크립트와 바이너리 파일의 실행권한 테스트


-- LAB 순서 --

1. 스크립트 파일 (rx 가 있을 경우)

2. 스크립트 파일 (x 만 있을 경우)

3. 바이너리 파일 (rx 가  있을 경우)

4. 바이너리 파일 (x 만 있을 경우)

5. 바이너리 파일 (x 를 제거할 경우)

-- LAB 순서 --


1. 스크립트 파일 (rx 가 있을 경우)

- 관리자가 a.sh 파일을 생성하고 관리자와 일반유저가 실행해보자.

~ # cd /tmp

/tmp # cat >> a.sh

#!/bin/sh


i=123

echo $i


/tmp # ls -l a.sh

-rw-r--r-- 1 root root 25 Feb 17 22:47 a.sh


/tmp # chmod a+x a.sh

/tmp # ./a.sh 

123


- 일반유저가 a.sh 파일을 실행한다.

/tmp $ ./a.sh         <-- a.sh 가 실행된 이유는 rx 권한이 있기 때문에 실행이 되었다.

123


2. 스크립트 파일 (x 만 있을 경우)

- 관리자가 a.sh 파일의 일반유저 부분의 읽기권한을 제거하고 일반유저가 실행해보자.

/tmp # chmod -c o-r a.sh 

mode of `a.sh' changed to 0751 (rwxr-x--x)


- 일반유저는 읽기 권한이 없으므로 실행파일을 실행할 수 없다.

/tmp $ ./a.sh        

/bin/sh: ./a.sh: Permission denied  


- 관리자는 파일의 읽기 권한을 제거하지만 실행이 된다. (왜 ? 관리자는 읽기/쓰기의 제약을 받지 않는다.)

/tmp # chmod -c ug-r a.sh 

mode of `a.sh' changed to 0311 (-wx--x--x)

/tmp # ./a.sh   

123


3. 바이너리 파일 (rx 가  있을 경우)

- 관리자가 바이너리 파일을 만들고 일반유저가 파일을 실행하고 복사해보자.

/tmp # vi hello.c

-- hello.c --

#include <stdio.h>


int main()

{

  puts("Hello C");

  return 0;

}

-- hello.c --

/tmp # gcc -o hello hello.c  <-- hello.c 를 hello 로 컴파일해서 실행파일을 생성한다.

/tmp # ls -l hello

-rwxr-xr-x 1 root root 4937 Feb 17 23:06 hello

/tmp # ./hello           <-- x 권한이 있으므로 hello 파일이 실행된다.

Hello C


/tmp $ ./hello           <-- 일반유저 또한 x 권한이 있으므로 hello 파일이 실행된다.

Hello C


- r 권한이 있으므로 복사할 수 있다. ( 파일을 복사한다는 것은 읽기 권한이 있어야 한다. )

/tmp $ cp hello hello2   

/tmp $ ls -l hello2

-rwxr-xr-x 1 linux linux 4937 Feb 17 23:23 hello2

/tmp $ ./hello2

Hello C


4. 바이너리 파일 (x 만 있을 경우)

- 관리자가 Other 부분의 r 권한을 제거하고 일반유저가 파일을 실행하고 복사해보자.

/tmp # chmod o-r hello   

/tmp # ls -l hello

-rwxr-x--x 1 root root 4937 Feb 17 23:06 hello


/tmp $ ./hello   <-- x 권한이 있으므로 실행이 된다. (바이너리 파일은 r 권한이 없어도 실행이 된다.)

Hello C

/tmp $ cp hello hello3   <-- Other 부분의 r 권한이 없으므로 복사가 안된다.

cp: cannot open `hello' for reading: Permission denied


5. 바이너리 파일 (x 를 제거할 경우)

- 관리자가 x 권한을 모두 제거하고 실행해 보면 아무도 이 파일을 실행할 수 없다.

/tmp # chmod a-x he/tmp # ls -l hello

-rw-r----- 1 root root 4937 Feb 17 23:06 hellollo   


/tmp # ./hello

- bash: ./hello: Permission denied


/tmp $ ./hello

- bash: ./hello: Permission denied

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


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

LAB> Set-GID 테스트 (장치파일의 쓰기권한)


# tty

/dev/pts/0

# ls -l /dev/pts/0

crw--w---- 1 root tty 136, 0 Feb 18 00:43 /dev/pts/0


# mesg y

$ wall hello   <-- 일반유저가 root 사용자에게 메세지를 보낸다.


# mesg n       <-- (mesg n) == (chmod g-w /dev/pts/0)

# ls -l /dev/pts/0

crw------- 1 root tty 136, 0 Feb 18 00:43 /dev/pts/0

$ wall hello    <-- 일반 유저가 root 에게 메세지를 보낼 수 없다.


Broadcast message from linux (pts/1) (Tue Feb 18 00:43:24 2014):


hello


# mesg y

# chmod g-s /usr/bin/wall   <-- 일반 유저가 wall 로 메세지를 보낼 수 없다.

$ wall hello                <-- tty 권한이 없으므로 root에게 메세지를 보낼 수 없다.


# chmod o+w /dev/pts/0 

# ls -l /dev/pts/0

crw--w--w- 1 root tty 136, 0 Feb 18 00:48 /dev/pts/0

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


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

LAB> 디렉토리 권한 테스트


[root@localhost ~]# cd

[root@localhost ~]# pwd

/root

[root@localhost ~]# ls -ld

drwxr-x--- 11 root root 4096 Oct 24 02:00 .

[root@localhost ~]# chmod o-r .

[root@localhost ~]# ls -ld

drwxr-x--- 11 root root 4096 Oct 24 02:00 .

[root@localhost ~]# chmod o+r .

[root@localhost ~]# ls -ld

drwxr-xr-- 11 root root 4096 Oct 24 02:00 .

[root@localhost ~]# 


[user1@localhost ~]$ pwd

/home/user1

[user1@localhost ~]$ cd /root

-bash: cd: /root: Permission denied

[user1@localhost ~]$ ls -l /root

total 0

?--------- ? ? ? ?            ? a

?--------- ? ? ? ?            ? A

?--------- ? ? ? ?            ? a.c

  :

  :




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


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

LAB> 디렉토리 권한 테스트


~ # cd /tmp

/tmp # umask

0022

/tmp # mkdir TEST

/tmp # ls -ld TEST

drwxr-xr-x 2 root root 4096 Feb 18 00:55 TEST

/tmp $ cd TEST              <-- x 권한이 있으므로 TEST 디렉토리에 들어갈 수 있다.

/tmp/TEST $ pwd

/tmp/TEST

/tmp/TEST $ cd ..



/tmp # touch TEST/a.txt TEST/b.txt

/tmp # ls -l TEST

total 8

-rw-r--r-- 1 root root 0 Feb 18 00:59 a.txt

-rw-r--r-- 1 root root 0 Feb 18 00:59 b.txt

/tmp # chmod o-x TEST

/tmp # ls -ld TEST

drwxr-xr-- 2 root root 4096 Feb 18 00:55 TEST

/tmp $ cd TEST              <-- x 권한이 있으므로 TEST 디렉토리에 들어갈 수 없다.

-bash: cd: TEST: Permission denied

tmp $ ls TEST -l

total 0

?--------- ? ? ? ?            ? a.txt

?--------- ? ? ? ?            ? b.txt


/tmp # chmod o=x TEST

/tmp # ls -ld TEST

drwxr-x--x 2 root root 4096 Feb 18 00:59 TEST

/tmp $ cd TEST               <-- 디렉토리에 들어갈 수 있으나 파일 목록은 볼 수 없다.

/tmp/TEST $ ls

ls: .: Permission denied


/tmp # chmod o=rwx TEST

/tmp # ls -ld TEST

drwxr-xrwx 2 root root 4096 Feb 18 00:59 TEST

/tmp/TEST $ vi a.txt       <-- a.txt 파일을 수정할 수 있다.

/tmp/TEST $ ll

total 12

-rw-r--r-- 1 linux linux 8 Feb 18 01:05 a.txt

-rw-r--r-- 1 root  root  0 Feb 18 00:59 b.txt

/tmp/TEST $ rm -f b.txt    <-- other 에 w 권한이 있으므로 b.txt 파일을 삭제할 수 있다.

/tmp/TEST $ ls -l

total 16

-rw-r--r-- 1 linux linux 8 Feb 18 01:05 a.txt

-rw-r--r-- 1 linux linux 8 Feb 18 01:06 c.txt

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


===================================== 여기까지 ===================================== 


실습> 시스템에서 Set-UID / Set-GID 파일을 몽땅 검색해보자.


# find / -perm -4000 -ls -perm -2000 

# find / \( -perm -4000 -perm -2000 \)  -ls 



-------



o 퍼미션 변경 연습 

# rsync -av /bin/cut .

# ls -l cut

   chmod   ln chown  chgrp vi, echo  vi, echo, touch  mv

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

-rwxr-xr-x  1 root   root  31880    Jul 22  2011     cut

 ~~~

  u ~~~

     g ~~~

        o


o chmod 에서 8진수 모드와 권한의 관계


8진수에서 가질 수 있는 값 : 0 ~ 7




# chmod u-wx,g-rw,o-r cut -c

rwxrwxrwx  -> r----x-wx  변경   chmod 413 

~~~           ~~~

 7  7  7      4  ~~~

                  1 ~~~

                     3


-wx-wx-wx -> --x------

1. chmod a=,u+x 

2. chmod go=,u-w 

3. chmod og=,u-w 

4. chmod go-wx,u-w

...


5. chmod 100


Symbolic mode 에서 가질 수 있는 문자들 : ugoa=+-,rwxst


---------  -> rwxr-x--x   chmod  751

chmod 000 

---------  -> --x--x---   chmod  110


LAB> 실행 디렉토리의 권한들을 살펴보세요!!! 

/bin , /usr/bin, /sbin, /usr/sbin


설치시 : 755 -> 보안상 권한을 변경하는 것이 좋다.


# ls -l /usr/sbin | more   <-- more 를 이용해서 살펴보기

# ls -l /sbin | less       <-- less 를 이용해서 살펴보기



확장된 권한들  (Set-UID (4), Set-GID (2), StickyBit (1) )

Set-UID : rwsr-xr-x

          ~~~

          root 

             ~~~

             root

                                linux 실행

Set-GID : 

---------  -> rwsr-xr-x   4755 -> rws--s--t  7711 -> rws-----x 4701

~~~

 u ~~~

    g ~~~

       o


# ls -ld /tmp

# ls -l /usr/bin/passwd

# ls -l /usr/bin/wall

# ls -l /bin/ping

# ls -ld /dev/shm


o Set-UID 이해하기

Set-UID 권한을 가지고 있는 파일을 일반유저가 실행하면 자신의(일반유저) 

권한으로 프로그램을 실행하는 것이 아니고 소유자의 권한으로 프로그램을 

실행하게 된다.

# ls -l /etc/shadow

-r-------- 1 root root 1218 May 30 10:32 /etc/shadow

# ls -l /usr/bin/passwd  <-- 일반유저가 실행하면 관리자권한이 되는 것이다.

-rwsr-xr-x 1 root root 20300 Aug 11  2010 /usr/bin/passwd

# useradd linux

# echo "1234" | passwd --stdin linux

Changing password for user linux.

passwd: all authentication tokens updated successfully.

# grep linux /etc/shadow

linux:$1$3/Z1I5Jz$irsRWkoqK2pSqRY9cmHjQ1:15490:0:99999:7:::

# su - linux

$ passwd

Changing password for user linux.

Changing password for linux

(current) UNIX password:

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

$ exit

# grep linux /etc/shadow <-- shadow 파일을 변경할 수 있는 것은 root 만이 가능

linux:$1$IT9znGxh$fgvJlTJbKONZCd6/lc1yZ0:15490:0:99999:7:::  <-- 변경되었음.



파일 / 디렉토리 

# ls -ld /tmp

#

#

drwxrwxrwx  -> a.txt(A) b.txt(B)  a.txt,b.txt 삭제(c) 삭제 O


drwxrwxrwt  -> a.txt(A) b.txt(B)  a.txt,b.txt 삭제(c) 삭제 X

         ~ -> x + t




   

# cd ; ls -ld

drwxr-x----   .... root

# ls -l /home

drwx-------   ... a

drwx-------   ... b

drwx-------   ... c

drwx-------   ... d


리눅스에서 실행할 수 있는 파일 

1. 컴파일해서 나온 바이너리 파일 (/bin/ls, mv ...)

2. 텍스트 형태의 쉘스크립트파일  (/etc/init.d/crond)


o 디렉토리의 x 권한 테스트


# mkdir -m 700 /tmp/TESTDIR

# ls -ld /tmp/TESTDIR

drwx------ 2 root root 4096 May 30 13:30 /tmp/TESTDIR


$ cd /tmp/TESTDIR    <-- x 권한이 없기 때문에 

-bash: cd: TESTDIR: Permission denied


o 실행파일 x 권한 테스트 

# ls -l /bin/cat

-rwxr-xr-x 1 root root 20776 Jul 22  2011 /bin/cat

# ls -ln /bin/cat

-rwxr-xr-x 1 0 0 20776 Jul 22  2011 /bin/cat


$ cat /etc/profile

# /etc/profile

# System wide environment and startup programs, for login setup

# Functions and aliases go in /etc/bashrc

...


# chmod -c o= /bin/cat

mode of `/bin/cat' changed to 0750 (rwxr-x---)

# ls -l /etc/profile

-rw-r--r-- 1 root root 1344 Feb 23 05:31 /etc/profile


$ cat /etc/profile   <-- cat x 권한이 없으므로 파일의 내용을 볼 수 없다.

-bash: /bin/cat: Permission denied



o 읽기권한(r) 테스트  


1. 일반 파일 테스트 

# chmod o+rx /bin/cat

# ls -l /etc/shadow

-r--------


o cat 은 실행권한이 있지만 /etc/shadow 파일에 읽기권한이 

없으므로 파일의 내용을 볼 수 없다.

$ cat /etc/shadow   

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

   1        2

1번의 권한을 살펴보고 권한이 있으면 2번의 권한을 살펴본다.


2. 디렉토리 테스트

$ cd /bin

$ ls      <-- /bin 디렉토리에 파일 목록이 출력.


# ls -ld /bin  <-- drwxr-xr-x -> drwxr-x--x (r권한 제거)

# chmod o-r /bin


$ cd /bin

$ ls      <-- r 권한을 제거했으므로 /bin 디렉토리에 파일 목록이 출력이 안됨.



o 쓰기권한(w) 테스트

1. 일반 파일을 테스트 


$ ls -l /etc/shadow  <-- Other 부분의 쓰기권한을 살펴볼 것

$ echo "1234" >> /etc/shadow  <-- 쓰기권한이 없으므로 안된다.


2. 디렉토리 테스트

$ ls -ld /home  <-- Other 부분의 쓰기권한을 살펴볼 것

drwxr-xr-x

 ~~~~~~

root.root

    

$ mkdir /home/Test <-- 쓰기권한이 없으므로 안된다.

$ cd  <-- 자신의 홈디렉토리로 이동 

$ mkdir Test  <-- 쓰기 권한이 있으므로 만들어진다.

drwx------

 ~~~

 자신의 권한

$ pwd

$ ls -ld 

$ ls -ld /etc  <-- Other 부분의 Write 권한을 확인 

drwxr-xr-x

 ~~~~~~

root.root 

$ rm -f /etc/passwd <-- 삭제가 안됨.


일반 유저가 저장(삭제)할 수 있는 디렉토리는 

리눅스가 설치되면 기본적으로 아래 디렉토리이다.

1. 자신의 디렉토리 

2. /tmp 디렉토리

3. /dev/shm  --> 보안상 Other 권한의 쓰기를 제거

4. /var/tmp  --> 보안상 Other 권한의 쓰기를 제거


o 제일 많이 사용하는 권한 

1. 파일 

-rw-r--r--

-rw-------

-rw-r----- 

-rw----r-- 

-r--------    :w <-- x    :w! <-- O


2. 디렉토리 

drwxr-xr-x    # ls -l /

drwx------    # ls -l /home   , # ls -ld /root

drwx-----x    drwxr-xr-x 차이점?

drwx--x---

drwx--x--x


# ls -ld /etc

# chmod o-r /etc

# ls -ld /etc


$ cd /etc

$ ls   <-- 읽기 권한이 없다.

$ ls -l passwd  <-- 파일의 속성을 확인할 수 있다.

$ cat passwd <-- 파일을 볼 수 있다.



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


[root@www ~]# groupadd -g 5000 project

[root@www ~]# groupadd -g 5000 project

groupadd: GID 5000 is not unique

[root@www ~]# groupadd -g 6000 project

[root@www ~]# useradd -g project user1

useradd: user user1 exists

[root@www ~]# userdel -r user1

[root@www ~]# userdel -r user2

[root@www ~]# userdel -r user3

userdel: /var/spool/mail/user3 not owned by user3, not removing

[root@www ~]# useradd -g project user1

[root@www ~]# useradd -G project user2

[root@www ~]# tail -2 /etc/passwd

user1:x:5001:6000::/home/user1:/bin/bash

user2:x:5002:5002::/home/user2:/bin/bash

[root@www ~]# tail -2 /etc/group

project:x:6000:user2

user2:x:5002:

[root@www ~]# install -m 070 -g project -d /project 

[root@www ~]# ls -ld /project

d---rwx--- 2 root project 4096 May 16 19:30 /project

[root@www ~]# su - user1

[user1@www ~]$ cd /project/

[user1@www project]$ id

uid=5001(user1) gid=6000(project) groups=6000(project)

[user1@www project]$ touch user1.txt

[user1@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:30 user1.txt

[user1@www project]$ rm -f ~/.bash_logout 

[user1@www project]$ exit

logout

[root@www ~]# su - user2

[user2@www ~]$ cd /project

[user2@www project]$ id

uid=5002(user2) gid=5002(user2) groups=5002(user2),6000(project)

[user2@www project]$ touch user2.txt

[user2@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:30 user1.txt

-rw-rw-r-- 1 user2 user2   0 May 16 19:31 user2.txt

[user2@www project]$ rm -f ~/.bash_logout 

[user2@www project]$ exit

logout

[root@www ~]# chmod g+s                   /project

[root@www ~]# ls -ld /project

d---rws--- 2 root project 4096 May 16 19:31 /project

[root@www ~]# 

[root@www ~]# 

[root@www ~]# 

[root@www ~]# 

[root@www ~]# su - user1

[user1@www ~]$ cd /project/

[user1@www project]$ touch user1-2.txt

[user1@www project]$ ls l

ls: l: No such file or directory

[user1@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:32 user1-2.txt

-rw-r--r-- 1 user1 project 0 May 16 19:30 user1.txt

-rw-rw-r-- 1 user2 user2   0 May 16 19:31 user2.txt

[user1@www project]$ exit

logout

[root@www ~]# su - user2

[user2@www ~]$ cd /project

[user2@www project]$ touch user2-2.txt

[user2@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:32 user1-2.txt

-rw-r--r-- 1 user1 project 0 May 16 19:30 user1.txt

-rw-rw-r-- 1 user2 project 0 May 16 19:33 user2-2.txt

-rw-rw-r-- 1 user2 user2   0 May 16 19:31 user2.txt

[user2@www project]$ rm -f *

[user2@www project]$ ls

[user2@www project]$ exit

logout

[root@www ~]# su - user1

[user1@www ~]$ cd /project/

[user1@www project]$ touch user1.txt

[user1@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:34 user1.txt

[user1@www project]$ exit

logout

[root@www ~]# su - user2

[user2@www ~]$ cd /project/

[user2@www project]$ touch user2.txt

[user2@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:34 user1.txt

-rw-rw-r-- 1 user2 project 0 May 16 19:34 user2.txt

[user2@www project]$ exit

logout

[root@www ~]# chmod o+t /project -c

mode of `/project' changed to 3070 (---rws--T)

[root@www ~]# su - user2

[user2@www ~]$ cd         /project

[user2@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:34 user1.txt

-rw-rw-r-- 1 user2 project 0 May 16 19:34 user2.txt

[user2@www project]$ ls -ld 

d---rws--T 2 root project 4096 May 16 19:34 .

[user2@www project]$ rm -f *

rm: cannot remove `user1.txt': Operation not permitted

[user2@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:34 user1.txt

[user2@www project]$ 

[user2@www project]$ 

[user2@www project]$ 

[user2@www project]$ exit

logout

[root@www ~]# chmod 2070 /project/ -c

mode of `/project/' changed to 2070 (---rws---)

[root@www ~]# su - user1

[user1@www ~]$ cd /project/

[user1@www project]$ ls

user1.txt

[user1@www project]$ rm -f *

[user1@www project]$ touch 1.txt

[user1@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:38 1.txt

[user1@www project]$ exit

logout

[root@www ~]# su - user2

[user2@www ~]$ cd /project/

[user2@www project]$ touch 2.txt

[user2@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:38 1.txt

-rw-rw-r-- 1 user2 project 0 May 16 19:38 2.txt

[user2@www project]$ rm -f *

[user2@www project]$ ls -l

total 0

[user2@www project]$ 


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

LAB> SetUID 테스트 (/etc/shadow, /usr/bin/passwd 를 이해하자)

# touch file.c file.txt

# chmod 600 file.txt 

# vi file.c 

-- file.c --

#include <stdio.h>   // printf , fprintf, 

#include <stdlib.h>  // exit


int main()

{

  FILE *fp;

  fp = fopen("file.txt", "a");

  if(fp == NULL)

  {

    fprintf(stderr,"파일을 열지 못했네용.\n");

    exit(1);

  }

  

  fprintf(fp, "Hello\n");

  fclose(fp);


  return 0;

}

-- file.c --


# gcc -o file file.c 

# ./file 

# cat file.txt 

Hello

# su user1

$ id

uid=9010(user1) gid=9010(user1) groups=9010(user1)

$ cat file.txt 

cat: file.txt: 허가 거부됨

$ ls -l file.txt 

-rw------- 1 root root 6  3월 17 23:33 file.txt

$ ./file 

파일을 열지 못했네용.

$ exit

exit

# cat file.txt 

Hello



# chmod u+s file -c

`file'의 모드를 4755(rwsr-xr-x)으로 변경하였습니다

# su user1

$ id

uid=9010(user1) gid=9010(user1) groups=9010(user1)


$ ./file 

$ ./file 

$ ./file 

$ exit

exit


# cat file.txt 

Hello

Hello

Hello

Hello


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

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

LAB>  /etc/shadow 파일에 일반 유저가 저장할 수 있는 이유는 무엇인가 ????


# ls -l /usr/bin/passwd 

-rwsr-xr-x 1 root root 23420  8월 11  2010 /usr/bin/passwd

# ls -l /etc/shadow

-r-------- 1 root root 2599  3월 17 23:07 /etc/shadow

# echo 1234 | passwd --stdin user1

# grep ^user1: /etc/shadow

user1:$6$M9cg4Pii$bCvrCaJE28A6d ...(생략)


# su - user1

$ passwd

Changing password for user user1.

Changing password for user1

(current) UNIX password:   <-- 1234

New UNIX password:         <-- 0000

Retype new UNIX password:  <-- 0000

passwd: all authentication tokens updated successfully.

$ exit


# grep ^user1: /etc/shadow

user1:$6$2uOUVUuA$xsXzjrtJlAOLtBh8

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


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

LAB> vhost_alias 모듈을 사용하여 가상호스트를 사용할 때 퍼미션 문제로 발생할 수 있는 

     문제점을 알아보고 대응을 해보자.


도메인명 : sbs.com, kbs.com, mbc.com


1. 웹서버 패키지 설치

- 패키지가 없다면 설치한다.

# yum -y install httpd


2. 사용자를 생성

- 가상호스트를 서비스하는 사용자를 생성한다.

# mkdir /etc/skel/public_html

# useradd sbsuser

# useradd kbsuser

# useradd mbcuser

# passwd sbsuser

# passwd kbsuser

# passwd mbcuser


# chmod 755 ~sbsuser

# chmod 755 ~kbsuser

# chmod 755 ~mbcuser


# echo "Welcome to sbs.com" > ~sbsuser/public_html/index.html

# echo "Welcome to kbs.com" > ~kbsuser/public_html/index.html

# echo "Welcome to mbc.com" > ~mbcuser/public_html/index.html

# chown sbsuser.sbsuser ~sbsuser/public_html/index.html:q:

# chown kbsuser.kbsuser ~kbsuser/public_html/index.html

# chown mbcuser.mbcuser ~mbcuser/public_html/index.html


3. 가상호스트(이름기반) 설정

- 웹서버의 가상호스틀 설정한다.

# cd /etc/httpd/conf

# vi httpd.conf

-- httpd.conf --

  :

LoadModule vhost_alias_module modules/mod_vhost_alias.so

  :

NameVirtualHost *:80


<VirtualHost *:80>

    DocumentRoot  /home/sbsuser/public_html 

    ServerName    sbs.com

    ServerAlias   www.sbs.com

</VirtualHost>

<VirtualHost *:80>

    DocumentRoot  /home/kbsuser/public_html 

    ServerName    kbs.com

    ServerAlias   www.kbs.com

</VirtualHost>

<VirtualHost *:80>

    DocumentRoot  /home/mbcuser/public_html 

    ServerName    mbc.com

    ServerAlias   www.mbc.com

</VirtualHost>

-- httpd.conf --


4. 아파치서버 시작

# /etc/init.d/httpd configtest

Syntax OK.

# /etc/init.d/httpd start

# netstat -nltp


5. DNS 설정

# vi /etc/hosts

-- /etc/hosts --

  :

  :

127.0.0.1   sbs.com www.sbs.com

127.0.0.1   kbs.com www.kbs.com

127.0.0.1   mbc.com www.mbc.com

-- /etc/hosts --


6. 웹서버 접속 테스트

# lynx --dump sbs.com


   Welcome to sbs.com


# lynx --dump kbs.com


   Welcome to kbs.com


# lynx --dump mbc.com


   Welcome to mbc.com

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


o 사례1)

웹사용자만 접근시키고 소유자를 뺀 모든 사용자가 각 홈디렉토리에 

접근하지 못하게 막는다. 


- 웹페이지 접근 사용자

apache

sbsuser

kbsuser

mbcuser


- 각 사용자 디렉토리 제한 사용자

sbsuser : kbsuser mbcuser (x)

kbsuser : sbsuser mbcuser (x)

mbcuser : kbsuser sbsuser (x)


-

# ls -ld /home/{sbs,kbs,mbc}user

drwxr-xr-x 3 kbsuser kbsuser 4096 Mar 18 01:47 /home/kbsuser

drwxr-xr-x 3 mbcuser mbcuser 4096 Mar 18 01:47 /home/mbcuser

drwxr-xr-x 3 sbsuser sbsuser 4096 Mar 18 02:21 /home/sbsuser


# chmod o= /home/{sbs,kbs,mbc}user

# ls -ld /home/{sbs,kbs,mbc}user

drwxr-x--- 3 kbsuser kbsuser 4096 Mar 18 01:47 /home/kbsuser

drwxr-x--- 3 mbcuser mbcuser 4096 Mar 18 01:47 /home/mbcuser

drwxr-x--- 3 sbsuser sbsuser 4096 Mar 18 02:21 /home/sbsuser


# lynx --dump sbs.com


                                   Forbidden


   You don't have permission to access / on this server.

     _________________________________________________________________



    Apache/2.2.3 (CentOS) Server at sbs.com Port 80


# grep apache /etc/passwd

apache:x:48:48:Apache:/var/www:/sbin/nologin

# grep 48 /etc/group

apache:x:48:


# chgrp apache /home/{sbs,kbs,mbc}user

# ls -ld /home/{sbs,kbs,mbc}user

drwxr-x--- 3 kbsuser apache 4096 Mar 18 01:47 /home/kbsuser

drwxr-x--- 3 mbcuser apache 4096 Mar 18 01:47 /home/mbcuser

drwxr-x--- 3 sbsuser apache 4096 Mar 18 02:21 /home/sbsuser


# lynx --dump sbs.com


   Welcome to sbs.com


# lynx --dump kbs.com


   Welcome to kbs.com


# lynx --dump mbc.com


   Welcome to mbc.com


# su - sbsuser

$ cd ~kbsuser

-bash: cd: /home/kbsuser: Permission denied

$ cd ~mbcuser

-bash: cd: /home/mbcuser: Permission denied


o 사례2)

일반 사용자를 특정 그룹에 포함시키고 홈디렉토리가 운영되는 디렉토리에 그 그룹이 

못들어오게 막는다. 


- 원래 권한으로 돌리고 시작한다.

# chmod 755 /home/{sbs,kbs,mbc}user

# chgrp sbsuser /home/sbsuser 

# chgrp kbsuser /home/kbsuser

# chgrp mbcuser /home/mbcuser

# ls -ld /home/{sbs,kbs,mbc}user

drwxr-xr-x 3 kbsuser kbsuser 4096 Mar 18 01:47 /home/kbsuser

drwxr-xr-x 3 mbcuser mbcuser 4096 Mar 18 01:47 /home/mbcuser

drwxr-xr-x 3 sbsuser sbsuser 4096 Mar 18 02:21 /home/sbsuser



- 사용자를 포함할 그룹을 생성한다.

# groupadd homepageuser

# tail -1 /etc/group

homepageuser:x:9018:


- 사용자의 그룹을 확인한다.

# su - sbsuser

$ id

uid=9015(sbsuser) gid=9015(sbsuser) groups=9015(sbsuser)

$ exit


# su - kbsuser

$ id

uid=9016(kbsuser) gid=9016(kbsuser) groups=9016(kbsuser)

$ exit


# su - mbcuser

$ id

uid=9017(mbcuser) gid=9017(mbcuser) groups=9017(mbcuser)

$ exit


# usermod -G homepageuser sbsuser

# usermod -G homepageuser kbsuser

# usermod -G homepageuser mbcuser


# su - sbsuser

$ id

uid=9015(sbsuser) gid=9015(sbsuser) groups=9015(sbsuser),9018(homepageuser)

$ exit


# su - kbsuser

$ id

uid=9016(kbsuser) gid=9016(kbsuser) groups=9016(kbsuser),9018(homepageuser)

$ exit


# su - mbcuser

$ id

uid=9017(mbcuser) gid=9017(mbcuser) groups=9017(mbcuser),9018(homepageuser)

$ exit


- 각 디렉토리의 권한을 변경한다.

# ls -ld /home/{sbs,kbs,mbc}user

drwxr-xr-x 3 kbsuser kbsuser 4096 Mar 18 03:10 /home/kbsuser

drwxr-xr-x 3 mbcuser mbcuser 4096 Mar 18 03:11 /home/mbcuser

drwxr-xr-x 3 sbsuser sbsuser 4096 Mar 18 02:21 /home/sbsuser


# chgrp homepageuser /home/{sbs,kbs,mbc}user

# ls -ld /home/{sbs,kbs,mbc}user

drwxr-xr-x 3 kbsuser homepageuser 4096 Mar 18 03:10 /home/kbsuser

drwxr-xr-x 3 mbcuser homepageuser 4096 Mar 18 03:11 /home/mbcuser

drwxr-xr-x 3 sbsuser homepageuser 4096 Mar 18 02:21 /home/sbsuser


# chmod g= /home/{sbs,kbs,mbc}user

# ls -ld /home/{sbs,kbs,mbc}user

drwx---r-x 3 kbsuser homepageuser 4096 Mar 18 03:10 /home/kbsuser

drwx---r-x 3 mbcuser homepageuser 4096 Mar 18 03:11 /home/mbcuser

drwx---r-x 3 sbsuser homepageuser 4096 Mar 18 02:21 /home/sbsuser


- 홈페이지 접근 테스트

# lynx --dump sbs.com


   Welcome to sbs.com


# lynx --dump kbs.com


   Welcome to kbs.com


# lynx --dump mbc.com


   Welcome to mbc.com


- 각 사용자 디렉토리 접근 테스트

# su - sbsuser

$ id

uid=9015(sbsuser) gid=9015(sbsuser) groups=9015(sbsuser),9018(homepageuser)

$ cd /home/kbsuser

-bash: cd: /home/kbsuser: Permission denied

$ cd /home/mbcuser

-bash: cd: /home/mbcuser: Permission denied

$ exit


# su - kbsuser

$ cd ~sbsuser

-bash: cd: /home/sbsuser: Permission denied

$ cd ~mbcuser

-bash: cd: /home/mbcuser: Permission denied

$ exit


# su - mbcuser

$ LANG=C

$ cd ~sbsuser

-bash: cd: /home/sbsuser: Permission denied

$ cd ~kbsuser

-bash: cd: /home/kbsuser: Permission denied

$ exit


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

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

LAB> Set-UID 권한 테스트


# ls -l /usr/bin/passwd 

-rwsr-xr-x 1 root root 23420  8월 11  2010 /usr/bin/passwd

# ls -l /etc/shadow

-r-------- 1 root root 2599  3월 17 23:07 /etc/shadow

# echo 1234 | passwd --stdin user1

# grep ^user1: /etc/shadow

user1:$6$M9cg4Pii$bCvrCaJE28A6d ...(생략)


# su - user1

# su - user1

$ passwd

Changing password for user user1.

Changing password for user1

(current) UNIX password:   <-- 1234

New UNIX password:         <-- 0000

Retype new UNIX password:  <-- 0000

passwd: all authentication tokens updated successfully.

$ exit


# grep ^user1: /etc/shadow

user1:$6$2uOUVUuA$xsXzjrtJlAOLtBh8

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



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

LAB> Linux Box 의 Set-UID 를 제거하자.


# mkdir bin; cd bin

# install -m 755 /dev/null change_perm.sh

# vi change_perm.sh

-- change_perm.sh --

#!/bin/sh


#filelist=`find / -perm -4000   2>/dev/null`

filelist=$(find / -perm -4000   2>/dev/null)


for i in $filelist

do

   if [ $i = "/bin/su" ]

   then

     continue

   fi  

   # 원래의 권한을 백업한다.

   echo $i >> /root/bin/change_perm.txt


   # set-uid, set-gid 권한을 제거한다.

   chmod -c ug-s $i

done


-- change_perm.sh --



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



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

LAB> 


$ cat /etc/passwd

 :

 :


1. alias 명령어, 내부명령어, 함수, 외부명령어를 찾는다.


2. 외부명령어 PATH 변수에서 찾는다. 

$ echo $PATH

/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/user1/bin


3. /bin 디렉토리에 x 권한이 있는가를 검사한다.

- /bin 디렉토리에 들어갈 수 없어서 프로그램이 종료된 것이다.

$ ls -ld /bin

drwxr-xr-x 2 root root 4096 Sep  4 23:55 /bin


# chmod o= /bin

# ls -ld /bin

drwxr-x--- 2 root root 4096 Sep  4 23:55 /bin

$ cat /etc/passwd

-bash: /bin/cat: Permission denied


# chmod o=rx /bin


4. cat 파일의 x 권한을 검사한다. 

- /bin/cat 파일을 실행할 수 없어서 프로그램이 종료된 것이다.

$ ls -l /bin/cat

-rwxr-xr-x 1 root root 23260 Jul 22  2011 /bin/cat


# ls -ld /bin

drwxr-xr-x 2 root root 4096 Sep  4 23:55 /bin

# ls -l /bin/cat

-rwxr-xr-x 1 root root 23260 Jul 22  2011 /bin/cat

# chmod o= /bin/cat -c

mode of `/bin/cat' changed to 0750 (rwxr-x---)


$ cat /etc/passwd

-bash: /bin/cat: Permission denied


# chmod o=rx /bin/cat


5. /etc 디렉토에 x 권한이 있는가를 검사한다.

- /etc 디렉토리에 들어갈 수 없어서 프로그램이 종료된 것이다.


cat /etc/passwd

cat: /etc/passwd: Permission denied

$ ls -ld /etc

drwxr-xr-x 81 root root 4096 Sep  5 13:00 /etc


- 권한을 변경해보자.

# chmod -c o= /etc 

mode of `/etc' changed to 0750 (rwxr-x---)


- 실행시 에러 발생

$ cat /etc/passwd

cat: /etc/passwd: Permission denied


- 원래대로 복구한다.

# chmod o=rx /etc


6. passwd 파일의 r 권한이 있는가를 검사한다.

- /etc/passwd 파일의 읽기 권한이 없어서 프로그램이 종료된 것이다.


$ ls -l /etc/passwd

-rw-r--r-- 1 root abc 1707 Sep  5 09:32 /etc/passwd


# chmod o-r /etc/passwd -c

mode of `/etc/passwd' changed to 0640 (rw-r-----)


$ cat /etc/passwd

cat: /etc/passwd: Permission denied


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



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

[CentOS] 9. 환경변수 테스트  (0) 2016.07.10
[CentOS] 8. 권한연습  (0) 2016.07.10
[CentOS] 중간 정리  (0) 2016.07.06
[CentOS] 7-1. 리눅스퍼미션  (0) 2016.07.02
[CentOS] 6. 파일 권한 테스트  (0) 2016.07.02

+ Recent posts