1. 리눅스 시스템 보안
리눅스 시스템의 보안 핵심은 사용자 계정이다. 각각의 사용자는 로그인할때 어떤 사용자로 로그인 하느냐에 따라 권한이 부여가 됩니다. 이러한 권한의 설정은
/etc/passwd파일에 정보가 담겨 있습니다.
$ cat /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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
rpm:x:37:37::/var/lib/rpm:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
|
위에서 passwd의 주요한 내용은 아래와 같은 6가지가 있습니다.
example: root:x:0:0:root:/root:/bin/bash
■ 첫번째 Field: 사용자 이름(root)
■ 두번째 Field: 사용자의 Password(x, 암호화 되어 보이지 않음)
■ 세번째 Field: 사용자 ID: 사용자의 ID값(0)
■ 네번째 Field: 사용자가 속해 있는 Group ID
■ 다섯번째 Field: 사용자에 대한 설명 및 주석
■ 여섯번째 Field: 사용자의 Home 디렉토리
■ 일곱번째 Field: 사용자가 사용하는 Shell Script(Bash Shell)
위의 예에서 보면 실제로 사용자가 만들지 않은 ID가 많습니다. 이들은 시스템 사용자라고 불리며 리눅스 시스템이 자동 생성한 id들입니다. 이러한 시스템 사용자의 ID는 500번 이하로 할당이 되고 일반 사용자가 생성한 ID들은 500 이상으로 생성이 됩니다.
과거의 시스템들은 사용자 passworf를 /etc/passwd 파일에 압호화 하여 저장을 하였지만 해킹등의 문제 /etc/passwd파일이 아니라 /etc/shadow로 패스워드관련 정보를 따로 저장을 하고 root에게만 접근이 가능하도록 변경이 되었습니다. 그럼 shadow 파일에 대해 알아 보겠습니다.
/etc/shadow 일 정보는 아래와 같습니다.
rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::
|
위의 각 정보는 세미콜론(:)으로 분리가 되고 9가지의 정보가 있습니다.
■ 첫번째 Field: rich는 사용자 이름을 나타냅니다
■ 두번째 Field: 암호화된 암호를 나타냅니다($1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020)
■ 세번째 Field: 1970년 1월1일 이후 경과한 일수를 나타냅니다(11627).
■ 네번째 Filed: 패스워드를 변경할 수 있는 최소 일수를 나태 냅니다(0)
■ 다섯번째 Field: 패스워드의 유효기간을 나타냅니다(99999)
■ 여섯번째 Field: 패스워드의 남은 유효기간을 사용자에게 경고하기 시작하는날 입니다.
■일곱번째 Field: 패스워드 만료 후 몇일 후에 사용자를 disable시킬지의 값입니다.
■ 여덜번째 Field: 사용자가 disable되고 나서 1970년 1월1일 부터 몇일이 지났는지를 표시 합니다.
■ 아홉번째 Field: 추후 사용을 위해 남겨둔 필드 입니다.
사용자 추가하기
사용자를 추가 하기 위해서는 useradd 명령을 사용합니다. useradd 명령은 한번에 여러가지 값들을 설정된 값대로 사용자를 생성해 주게 됩니다. 디폴트 값을 확인하는 방법은 아래와 같습니다.
# /usr/sbin/useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
#
|
usdadd를 통해 사용자를 생성하면 위의 값들이 해당 사용자에게 기본적으로 적용이 됩니다.
위의 예에서 "SKEL=/etc/skel" 이 파레메터의 역활은 사용자가 생성될때 사용자의 HOME디렉토리에 생성될 기본 파일들을 skle 디렉토리에서 자동 복사 한다는 것 입니다. 꼭 디폴트로 생성할 파일들이 있으면 skel폴더로 복사를 해놓으면 됩니다.
디폴트 값을 변경할때느누 -D옵션과 함께 변경하고 싶은 파라메터를 사용하면 됩니다.
# useradd -D -s /bin/tsch
# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/tsch
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
#
|
사용 가능한 파레메터들으 아래표와 같습니다.
사용자를 생성하는 예제 입니다.
우선 home/test 라는 디렉토리를 만들고 test라는 사용자를 생성해 보겠습니다.
$mkdir /home/test
$useradd test
그리고 /etc/passwd 파일을 보면 제대로 생성된것을 알수 있습니다.
$ cat /etc/passwd | grep test
test:x:1001:1001::/home/test:
사용자 삭제 하기
사용자는 userdel 명령을 이용해 삭제할 수 있습니다. 다만 사용자가 생성한 모든 파일을 지우고자 할때에는 -r 옵션을 같이 사용하여 삭제 하여야 사용자 소유의 파일들이 같이 지워 집니다.
$userdel -r test
사용자 정보 수정하기
사용자 정보를 수정하는데에는 아래 명령어가 쓰입니다.
usermod 사용자 옵션 순으로 사용을 하면 됩니다.
ex) usermod test -l test1234
■ -l : : 사용자 계정을 변경할때 쓰는 옵션 입니다.
■ -L : 사용자를 로그인 하지 못하게 잠그는 옵션 입니다.
■ -p : 사용자의 패스워드를 변경할때 사용하는 옵션 입니다.
■ -U : 사용자의 상태를 락에서 풀어주는 옵션 입니다.
passwd와 chpasswd
단순히 사용자 한명의 패스워드를 바꿀대는 passwd를 아래와 같이 사용하면 된다.
passwd root
새암호:
암호확인:
하지만 많은 사용자의 패스워드를 입력할때에는 chpasswd가 유용하다
사용하는 방법은 아래와 같다.
$chpasswd
root:1234
snoopy:1234
test01:1234 d
Ctrl +D ==> 입력을 마치려면 입력 한다.
chsh, chfn
chsh 명령은 사용자가 사용할 SHELL sCRIPT를 바꿀수 있습니다.
# chsh -s /bin/csh test
Changing shell for test.
Shell changed.
#
chgn 명령은 finger 명령을 통해 보여지는 사용자의 정보를 변경할수 있는 명령 입니다.
# chfn test
Changing finger information for test.
Name []: Ima Test
Office []: Director of Technology
Office Phone []: (123)555-1234
Home Phone []: (123)555-9876
Finger information changed.
# finger test
Login: test
Directory: /home/test
Office: Director of Technology
Home Phone: (123)555-9876
Never logged in.
No mail.
No Plan.
#
2. 리눅스 그룹 사용하기
위에서본 사용자 관리만으로는 자원공유를 하기에는 부족하다. 사용자간 자원을 공유 할때에는 Group 사용이 매우 유용하고 Group을 사용하는 방법을 알아 보도록 하겠다.
Group설정 정보는 /etcgroup file안에 있다.
$cat /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
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
■첫번째 Field는 Group명을 나타낸다
■두번째 Field는 Group 패스워드를 나타낸다
■세번째 Field는 Group ID를 나타낸다
■네번째 Field는 해당 그룹에 속한 사용자를 나타낸다.
그룹에 사용자를 축할때에는 /etc/group 파일을 편집을 하면 안되고 usermod를 사용하여 추가 하여야 한다.
그룹 생성하고 사용자 추가 하기.
그룹 생성하기
$groupadd shared
# tail /etc/group
haldaemon:x:68:
xfs:x:43:
gdm:x:42:
mysql:x:27:
test:x:504:
shared:x:505:
#
사용자를 그룹에 추가하기
$ # /usr/sbin/usermod -G shared rich
# tail /etc/group
haldaemon:x:68:
xfs:x:43:
test:x:504:
shared:x:505:rich, test
그룹정보 수정하기
$ groupmod -n sharing shared ==> -n 옵션은 그룹명 변경
$ groupmod sharing -g 2000 ==> -g 옵션은 그룹 ID 변경
3. 파일 퍼미션 이용하기
ls 명령을 이용하면 각 파일 및 디렉토리의 퍼미션을 확인 할 수 있다.
$ ls -al
각 파일의 맨 왼쪽에 있는 첫번째 문자의 의미는 아래와 같다.
■ - : 파일을 의미한다.
■ d : 디렉토리를 의미한다.
■ l : 링크파일을 의미한다.
■ c :케릭터 파일을 의미한다.
■ b : 블럭 파일을 의미한다.
■ n : 네트워크 파일을 의미한다.
그다음 나오는 9개의 문자는 3개씩 나뉘어 지며 권한은 아래와 같이 파일의 소유자/그룹/모두의 권한을 나타낸다. r을 파일을 읽을수 있는 권한이고, w는 쓸수 있는 권한. x는 해당 파일을 실행시킬수 있는 권한을 의미한다.
umask 이해하기
리눅스 시스템에서는 아무런 옵션을 주지 않고 파일이나 디렉토리를 생성하면 기본적으로 생성되는 파일 권한이 적용된다. 이는 umask값을 가지고 설정이 되는데.
아래의 파일 권한을 보면 umsak가 022로 설정이 되어 있을때 설정되는 권한니다
-rw-r--r-- 1 root root 0 4월 12 22:27 newfile
파일은 풀 퍼미션을 가질때 십진수 값이 666이다. 여기에 umask값을 빼서 기본 퍼미션을 생성하게 된다. 즉. umaks값이 0022라면 첫번째 0은 sticky값이라서 생략하고 두번째 0은 소유자권한을 설장 하는 값이고, 세전째 2는 그룹의 권한, 마지막 2년 other의 권한이다.
그럼 파일의 풀 퍼미션 값 666 - 022은 = 644
644를 이진수로 표시를 해보면 rw-r--r-- 이렇게 생성이 되는 것이다.
그룹의 풀 퍼미션값을 777로 위와 같이 계산을 하면 된다.
4. 퍼미션 변경해 보기
파일이나 디렉토리의 퍼미션을 변경하는 명령의 형식은 아래와 같다
$chmod options mode file
여기서 mode는 숫자나 심볼릭 형식으로 나타낼 수 있다.
숫자형식
$ chmod 760 newfile ==> 7(소유자에게 rwx), 6(그룹에 r, w), other에 무권한
$ ls -l newfile
-rwxrw---- 1 rich rich 0 Sep 20 19:16 newfile*
심볼릭 형식
사용 구문 : [ugoa...][[+-=][rwxXstugo...]
example)
$ chmod o+r newfile ==> o(소유자)에게 r(읽기)권한 추가
심볼릭 형식에서 옵션들의 의미는 아래와 같다.
[첫번째 그룹]
■ u : 소유자
■ g: 그룹
■ o : 다른 사용자
■ a : 모든 사용자
[두번째 그룹]
■ r: read권한 부여
■ w: 쓰기 권한 부여
■ x: 실행권한 부여
5. 소유권 변경하기
파일의 소유권 변경하는 방법은 아래의 형식과 같습니다.
chown option owner[.group] filename
example)
1)소유자반 변경하기
# chown test testfile
# ls -l testfile
-rw-rw-r-- 1 test testuser 0 Sep 20 19:16 newfile
#
2) 소유자와 그룹을 같이 변경하기(소유자 뒤에 점(.)을 사용하여 그룹명 지정)
# chown test1.test testfile
#ls -l testfile
-rw-rw-r-- 1 test1 test 0 Sep 20 19:16 newfile
#
3) 그룹만 변경하기
#chown .test1 testfile(소유자를 생략하고 그룹만 변경)
#ls -l testfile
-rw-rw-r-- 1 test1 test1 0 Sep 20 19:16 newfile
#
4) 사용자가 속한 디폴트 그룹으로 소유권 변경
#chown test. testfile(점만 기입하고 그룹명을 생략 하면 디폴트 그룹으로 지정됨)
#ls -l testfile
-rw-rw-r-- 1 test test 0 Sep 20 19:16 newfile
#
5) 유용한 옵션
-R: 이 옵션은 소유권 변경을 하위 디렉토리 및 파일에 모두 적용할때 사용가능하다.
-h: 심볼릭으로 연결되어 있는 파일들의 소유권도 모두 변경해 준다.
6)주의할점
root 사용자만이 파일의 소유권을 변경할수 있고, 다른 사용자들은 파일의 디폴트 그룹만 변경이 가능하다. 단 해당 사용자는 동일 그룹에 속해 있는 파일들만 변경 가능하다.
chgrp명령어는 파일이나 디렉토리의 디폴트 그룹을 쉽게 변경하게 해준다.
$ chgrp test testfile
$ ls -l testfile
-rw-rw-r-- 1 rich test 0 Sep 20 19:16 testfile*
$
6. 파일 공유
리눅스 시스템은 사용자가 파일을 생성할때 사용자의 UID와, GID를 이용해 권한을 부여한다. 다른 사용자들이 이 파일에 접속을 하기 위해서는 보안 권한을 변경을 하거나 디폴트 그룹을 변경을 해주어야 됩니다. 이런 작업은 대량의 파일이나 사용자가 많은 시스템에서는 귀찮은 일입니다. 하지만 이런 번거러움을 쉽게 하는 방법은 아래와 같습니다.
리눅스 에서는 파일 권한과 관련된 3가지 추가 비트가 있고, 각각의 값이 설정될때 영향은 아래와 같습니다.
■ The set user id (SUID): 사용자에 의해 파일이 실행될때, 프로그램은 파일 소유자의 권한아래에서 실행이 되게 됩니다.
■ The set group id (SGID): 파일은 파일그룹의 권한 아래에서 실행이되고, 새롭게 생성되는 파일든은 디렉토디렉토리 그룹을 디폴트 그룹으로 사용하게 됩니다.
■ The sticky bit: 프로세스에서 처리된 파일이 메모리에 남게 됩니다.
chmod 명령은 일반적으로 chmod 755와 같이 사용하지만 사실은 chmod를 입력을 하면 chmod 0755로 수행이 된다. 따라서 위와 같이 해당 비트를 사용하고 싶을때에는 chmod 1755d와 같이 사용하면 됩니다.
여기서 파일 공유를 위해 SGID를 이용해 보겠습니다. SGID를 설정하게 되면 Test 디렉토리에 생성되는 모든 파일은 디렉토리 그룹에 속하게 만들어 줍니다.
$ mkdir test ==> test 디렉토리 생성
$ ls -l
drwxrwxr-x 2 rich 4096 Sep 20 23:12 test/
$ chgrp shared test ==> test디렉토리를 shared 그룹으로 변경
$ chmod g+s test ==> test 디렉토리에 SGID 설정 후 이 데렉토리에 생성되는 모든 파일은 shared와 공유
$ ls -l
drwxrwsr-x 2 rich shared 4096 Sep 20 23:12 testdir/
$ umask 002 ==> 소유자에게는 풀권한, 그룹에게 풀권한, 다른 사용자에게 읽기 권한만 수행하게 변경
$ cd test
$ touch testfile
$ ls -l
total 0
rw-rw-r-- 1 rich shared 0 Sep 20 23:13 testfile
$
'쉘스크립트' 카테고리의 다른 글
구조화된 명령어들 (1) | 2022.07.06 |
---|---|
기본 Shell 스크립트 작성 (1) | 2022.07.05 |
환경 변수 (1) | 2022.07.04 |
Bash Shell 명령어들 (0) | 2022.07.04 |
Bash Shell 기본 명령어 (1) | 2022.07.04 |