본문 바로가기
프로그래밍 놀이터/Script(Python)

[책 정리] 07. 리눅스 파일 사용 권한 이해하기 - 리눅스 커맨드라인 쉘 스크립트 바이블

by 돼지왕 왕돼지 2020. 4. 26.
반응형

리눅스 보안


-

리눅스 보안 시스템의 핵심은 사용자 계정이다.

리눅스 시스템에 접속하는 개별 사용자는 각자 고유한 사용자 계정이 있어야 한다.

시스템에 있는 개체에 대한 사용자의 권한은 로그인한 사용자 계정에 따라 달라진다.


사용자 권한은 계정이 만들어질 때 할당되는 사용자 ID 인 UID 로 추적된다.

리눅스 시스템은 시스템의 사용자 계정을 추적하고 관리하기 위한 특수한 파일 및 유틸을 사용한다.



* /etc/passwd 파일


-

리눅스 시스템은 로그인 이름과 그에 해당하는 UID 값을 찾기 위해 특별한 파일을 이용한다.

이 파일은 /etc/passwd 파일이다.

여기에는 사용자에 대한 여러 정보가 포함되어 있다.



-

root 사용자 계정은 리눅스 시스템의 관리자이며 항상 UID 0 이 할당된다.

리눅스 시스템은 실제 사용자가 아닌 다양한 기능에 관련된 사용자 계정을 많이 만든다.

이러한 계정들을 시스템 계정이라고 한다.

시스템 계정은 시스템에서 구동되는 서비스들이 시스템 자원에 접근하는 권한을 얻기 위해서 사용하는 특별한 계정이다.

백그라운드 모드에서 실행되는 모든 서비스는 시스템 사용자 계정으로 리눅스 시스템에 로그인해야 한다,


보안이 큰 문제가 되기 전에는 서비스는 종종 root 사용자 계정으로 로그인했다.

하지만 권한이 없는 사람이 이러한 서비스 중 하나에 침입하면 그는 즉시 root 사용자로 시스템에 대한 접근 권한을 얻게 된다.

이를 막기 위해 이제는 리눅스 서버에서 백그라운드로 실행되는 모든 서비스는 자체 사용자 계정으로 로그인해야 한다.

이렇게 하면 해커가 설령 서비스를 통해 침입하더라도 전체 시스템에 대한 접근 권한을 얻을 수 없다.


리눅스는 시스템 계정을 위해 500 이하의 UID 를 유보해 둔다.

제대로 작동하려면 특정한 UID 가 필요한 서비스도 있다.

일반 사용자 계정을 만들 때 대부분의 리눅스 시스템은 첫 번째 사용 가능한 UID 를 500 에서 시작해서 할당해 나간다. (모든 배포판이 그런건 아니다.)



-

/etc/passwd 파일에는 사용자의 로그인 이름과 UID 외에도 많은 정보들이 있다.

    로그인 사용자의 이름

    사용자의 암호

    사용자 계정의 숫자 UID

    사용자 계정의 숫자 GID

    사용자 계정의 설명 텍스트(주석 필드)

    사용자의 HOME 디렉토리 위치

    사용자의 기본 쉘


여기서 암호 필드는 X 로 설정된다.

지금 대부분의 리눅스 시스템은 사용자의 암호를 별도 파일에 저장한다. (/etc/shadow)

특별한 프로그램(가령 로그인 프로그램)만이 이 파일에 접근할 수 있다.



-

/etc/passwd 파일을 직접 수정할 수 있으나 이 방법은 매우 위험하다.

이 파일이 손상되면 시스템은 이를 읽을 수 없으며 그 결과로 root 를 포함한 누구도 로그인할 수 없게 된다.

대신 사용자 관리 기능을 수행하기 위해 표준 리눅스 사용자 관리 유틸을 사용하는 것이 더 안전하다.



* /etc/shadow 파일


-

/etc/shadow 파일은 리눅스 시스템이 암호를 관리하는 방법에 대한 통제권이 더 많다.

root 사용자는 /etc/passwd 파일보다 더 안전하게 /etc/shadow 파일에 접근할 수 있다.

/etc/shadow 에는 아홉 개의 필드가 있다.

    /etc/passwd 파일의 로그인 이름에 해당하는 로그인 이름

    암호화된 암호

    암호가 마지막으로 변경된 날짜로 1970년 1월 1일을 시작으로 한 일 수

    암호를 변경할수 있게 될 때까지의 최소 일 수

    암호를 변경해야 하는 날까지의 남은 일 수

    사용자에게 암호를 변경하라고 경고하는 날까지의 남은 일 수

    게정이 만료되어 비활성화 되는 날까지의 남은 일수

    사용자 계정이 비활성화 된 날(1970년 1월 1일 기준)

    향후 사용을 위해 유보된 필드


섀도우 암호 시스템을 사용하여 리눅스 시스템은 사용자 암호를 더 정밀하게 제어할 수 있다.

사용자가 암호를 변경해야 하는 빈도, 암호를 변경하지 않으면 언제 사용자 계정을 비활성화할 것인지등을 제어할 수 있다.



* 새 사용자 추가하기


-

새로운 사용자를 추가하기 위해 사용되는 기본 도구는 useradd 다.

이 명령은 새 사용자 계정을 만들고 사용자의 HOME 디렉토리 구조까지 한꺼번에 설정하는 쉬운 방법을 제공한다.

시스템 기본값을 확인하려면 useadd 명령에 -D 옵션을 주면 된다.


ex)

GROUP=100

HOME=/home

INACTIVE=-1 # 암호가 만료되어도 계정을 비활성화 불가능

EXPIRE= # 새 계정은 설정된 날짜에 만료되도록 설정 불가능

SHELL=/bin/bash

SKEL=/etc/skel # 사용자의 HOME 디렉토리에 복사할 폴더

CREATE_MAIL_SPOOL=yes # 메일 디렉토리 만듦



-

$ useradd -m test # -m 은 HOME 디렉토리를 만들라고 지시.


새 사용자를 만들 때 기본값 또는 기본 특성을 다른 값으로 대체하고 싶다면 옵션을 주면 된다.

-c comment : 새 사용자의 주석 필드에 comment 를 추가

-d home_dir : 홈 디렉토리를 로그인 이름이 아닌 다른 이름으로 지정

-e expire_date

-f inactive_days : 암호가 만료되고 며칠 후 계정을 사용할 수 없게 만들지 지정. 0 은 암호가 만료되는 즉시 계정 사용 못함. -1은 이 기능을 사용하지 않음

-g initial_group : GID 지정

-G group... : 사용자가 속할 하나 이상의 추가 그룹 지정

-k dir : HOME 디렉토리에 복사할 내용 지정, -m 옵션을 함께 지정해줘야 효과가 있다.

-m : 사용자의 HOME 디렉토리 만듦

-M : -m 의 반대

-n : 사용자의 로그인 이름과 같은 이름을 사용하여 새로운 그룹을 만든다.

-r : 시스템 계정을 만든다.

-p passwd : 사용자 계정에 대한 기보 암호를 지정한다.

-s shell : 기본 로그인 쉘을 지정한다.

-u uid



-

기본값을 변경할 수도 있다.

$ useradd -D -s /bin/tsch




* 사용자 없애기


-

usedel 명령을 사용한다.

이 명령은 /etc/passwd 파일에서 사용자 정보를 지우는 일만 하며, 해당 계정이 시스템에 가지고 있는 어떤 파일도 지우지 않는다.

-r 매개변수를 사용하면 HOME 디렉토리와 mail 디렉토리를 함께 제거한다.

삭제된 사용자 계정이 가지고 있던 다른 파일은 여전히 시스템에 남기도 해서 어떤 환경에서는 문제가 될 수 있다.


-r 옵션을 사용할 때는 항상 한번 더 확인해야 한다.



* 사용자 수정하기


-

usermod : 사용자 계정 필드를 편집하는 것은 물론 기본 및 보조 그룹 구성원을 지정한다.

passwd : 기존 사용자의 암호를 변경한다.

chpasswd : 로그인 이름과 암호가 한 쌍으로 된 파일을 읽어 암호를 갱신한다.

chage : 암호의 만료 날짜를 변경한다.

chfn : 사용자 계정의 주석 정보를 변경한다.

chsh : 사용자 계정의 기본 쉘을 변경한다.



** usermod


-

이 명령은 /etc/passwd 파일의 필드 대부분을 변경할 수 있는 기능을 제공한다.

-c 는 주석 필드를 변경하고, -e 는 만료 기간을 변경하고, -g 는 기본 로그인 그룹을 변경한다.

그 외에도 유용한 옵션은..

-l : 사용자 계정의 로그인 이름을 변경

-L : 사용자가 로그인 할 수 없도록 계정을 잠금

-p : 계정의 암호를 변경

-U : 사용자가 로그인 할 수 있도록 계정 잠금을 해제



** passwd, chpasswd


-

사용자 암호만을 변경하는 빠른 방법은 passwd 명령이다.

자신의 암호 변경을 위해서는 아래와 같이 한다.

$ passwd user_id



-

다른 사람의 암호를 변경하려면 root 사용자의 원한이 필요하다.

-e 옵션은 다음 로그인 때 사용자가 암호를 변경하도록 강제할 수 있는 편리한 방법이다.

이 옵션은 사용자의 암호를 일단 간단한 값으로 설정한 다음 이를 좀 더 복잡하지만 사용자는 기억할 수 있는 값으로 변경하도록 강제할 수 있다.



-

시스템에 있는 사용자의 암호를 대량으로 변경해야 하는 경우 chpasswd 명령이 유용하다.

표준 입력으로부터 로그인 이름과 암호가 한 쌍(콜론으로 구분)으로 된 목록을 읽어 자동으로 암호를 부호화하고 사용자 계정을 설정한다.

$ chpasswd < users.txt # userid:password 쌍으로 된 파일



** chsh, chfn 및 chage


-

chsh 은 기본 로그인 쉘을 변경할 수 있다.

$ chsh -s /bin/cash user_id



-

chfn 명령은 /etc/passwd 파일의 주석 필드의 정보를 변경한다.

이름이나 별명과 같은 텍스트를 넣거나 주석 필드를 아예 비워버리는 대신 chfn 명령은 주석 필드에 정보를 저장하기 위하여 finger 명령에서 쓰이는 특정한 정보를 사용한다.

$ chfn user_id # 주석 필드에 입력할 값을 물어본다.



-

chage 명령을 사용하면 사용자 계정의 암호를 얼마나 오래 쓸지를 관리할 수 있다.


-d : 암호가 마지막으로 변경된 날로부터의 일수를 설정한다.

-E : 암호가 만료되는 날짜를 설정한다.

-l  :  암호가 만료된 날로부터 계정을 잠궈 비활성화시킬 날까지의 일수를 설정한다.

-m : 암호 변경 날짜 사이의 최소 일수를 설정한다.

-W : 암호가 만료되는 날로부터 며칠 전부터 경고 메시지를 보여줄지 일수를 설정한다.


chage 날짜 값은 두 가지 방법 중 하나를 사용하여 표현할 수 있다.

    YYYY-MM-DD

    1970/01/01 기준 일수를 뜻하는 숫자값



-

chage 의 장점 중 하나는 임시 사용자 계정을 만든 다음 이를 삭제해야 한다는 사실을 기억하지 않아도 되도록 지정된 날짜에 계정을 만료시킬 수 있다는 점이다.




리눅스 그룹 사용하기


-

사용자 계정은 개별 사용자의 보안을 제어하기 위한 좋은 방법이지만 사용자의 그룹이 자원을 공유하는 방법으로서는 좋지 않다.

이를 위해 리눅스 시스템은 '그룹' 형태의 보안 개념을 사용한다.

그룹 권한은 여러 사용자가 파일, 디렉토리, 장치와 같은 시스템의 자원에 관한 공통의 권한 세트를 공유할 수 있도록 한다.



-

리눅스 배포판은 기본 그룹 구성원을 다루는 방법에 약간 차이가 있다.

일부 리눅스 배포판은 모든 사용자 계정을 구성원으로 하는 단 한 개의 그룹만을 만든다. 이런 리눅스는 주의해야 한다.

다른 배포판은 좀 더 강력한 보안을 위해 각 사용자에 대해 따로 그룹 계정을 만들기도 한다.


GID 와 함께 각 그룹은 고유한 그룹 이름이 있다.

리눅스 시스템에 자신의 그룹을 만들고 관리하기 위해 몇 가지 그룹 유틸을 사용할 수 있다.



* /etc/group 파일


-

사용자 계정과 마찬가지로 그룹 정보는 시스템 파일에 저장된다.

/etc/group 파일에는 시스템이 사용하는 각 그룹에 대한 정보가 포함되어 있다.


UID 와 마찬가지로 시스템 계정에 사용되는 그룹에는 500 미만의 GID 가 할당되고 사용자 그룹은 500에서 시작되는 GID 가 할당된다.

/etc/group 파일은 네 개의 필드를 사용한다.

    그룹 이름

    그룹 암호

    GID

    그룹에 속한 사용자 계정의 목록


그룹 암호를 사용하면 그룹 구성원이 아닌 사용자가 암호를 사용해서 임시로 그룹의 구성원이 될 수 있다.

이 기능은 널리 사용되지는 않지만 있기는 있다.



-

/etc/group 파일을 편집해서 그룹에 사용자를 추가해서는 안 된다.

그룹에 사용자 계정을 추가하려면 usermod 명령을 사용한다.

서로 다른 그룹에 추가하려면 먼저 그룹을 만들어야 한다.

(사용자 계정이 /etc/passwd 파일에 있는 기본 그룹을 그룹으로 사용하는 경우, 이 사용자 계정은 /etc/group 파일에 구성원으로 나타나지 않는다.)



* 새 그룹 만들기


-

groupadd 명령을 사용하면 시스템에 새 그룹을 만들 수 있다.

$ groupadd test_group


새 그룹을 만들 때에는 어떤 사용자도 기본적으로 소속되지 않는다.

groupadd 명령은 그룹에 사용자 계정을 추가하는 옵션을 제공하지 않는다.

그래서 새로운 사용자를 추가하고 나서 usermod 명령을 사용해야 한다.

$ usermod -G test_group test_user


-g 옵션을 사용하는 경우 지정한 그룹 이름은 사용자 계정의 기본 그룹을 대체한다.

-G 는 사용자가 소속된 그룹의 목록을 추가시키고 기본 그룹을 건드리지 않는다.

따라서 옵션 사용을 주의해야 한다.


현재 시스템에 로그인되어 있는 계정의 사용자 그룹을 변경한 경우, 변경한 내용을 적용하려면 사용자는 로그아웃 한 후 다시 로그인해야 한다.



* 그룹 수정하기


-

groupmod 명령을 쓰면 사용자가 -n 와 그룹이름 또는 -g 와 GID 로 그룹정보를 변경할 수 있다.

$ groupmod -n test_group test_group2

그룹의 이름을 변경하면 GID 와 그룹 구성원은 그대로 남아 있고 이름만 바뀐다.




파일 권한 해석하기


* 파일 권한 기호 사용하기


-

ls -l 로 출력되는 앞부분에 권한에 대한 정보가 있다.

ex)

-rw-rw-r--

drwxrwxr-x


첫번째 문자는 개체의 유형을 정의한다.

    - : 파일

    d : 디렉토리

    l : 링크

    c : 문자 장치

    b : 블록 장치

    n : 네트워크 장치


그 다음에는 세 개의 문자로 이루어진 세 개의 세트가 나온다.

    r : 읽기 권한

    w : 쓰기 권한

    x : 실행 권한

    - : 권한이 거부됨


세개의 세트는 각각 다음을 의미한다.

    개체의 소유자

    개체를 소유한 그룹

    시스템의 다른 사용자들




* 기본 파일 권한


-

파일의 권한은 umask 가 부여한다.

umask 명령은 사용자가 만든 파일이나 디렉토리에 대한 기본 권한을 보여주거나 설정한다.

$ umask

0022 # 기본은 rw-r--r--


첫번째 숫자는 스티키 비트(sticky bit)라는 특수한 보안 기능을 나타낸다.

다음 세자리 숫자는 파일이나 디렉토리에 대한 umask 의 8진수 값을 나타낸다.

8진수 모드 보안 설정은 rwx 이 세가지 권한 값을 3비트 2진수 값으로 변환한다.


기호 : binary : octal : 의미

--- : b000 : 00 : 권한 없음

--x : b001 : 01 : 실행 전용 권한

-w- : b010 : 02 : 쓰기 전용 권한

-wx : b011 : 03 : 쓰기 및 실행 권한

r-- : b100 : 04 :  읽기 전용 권한

r-x : b101 : 05 : 읽기 및 실행 권한

rw- : b110 : 06 : 읽기 및 쓰기 권한

rwx : b111 : 07 : 읽기, 쓰기, 및 실행 권한


umask 값은 주고 싶지 않은 권한에 대해 설정하는 것이다.

파일에 대한 모든 권한 모드는 666 이고, 디렉토리에 대해서는 777 이기에 666-022=644 가 된다.



-

다음과 같이 권한에 대한 기본값을 바꿀 수도 있다.

$ umask 026 #640 에 해당된다.




보안 설정 변경하기


* 권한 변경하기


-

chmod 명령으로 파일과 디렉토리에 대한 보안 설정을 변경할 수 있다.

$ chmod options mode file

$ chmod 760 newfile


mode 매개변수는 8진수 또는 기호 모드를 사용하여 지정할 수 있다.

8진수 모드 설정은 앞서 다룬 값을 적어주면 된다.



-

기호모드는 다음의 방법을 쓴다.

[ugoa..][[+-=][rwxXstugo...]


첫번째 괄호는 적용 대상이다.

    u : 사용자

    g : 그룹

    o : 다른 사용자

    a : 모든 사용자


두번째는 권한의 추가삭제 여부이다.

    + : 추가

    - : 제거

    = 지정한 값으로 설정


마지막의 rwx 외에는 다음과 같다.

    X : 개체가 디렉토리거나 이미 실행 권한이 있을 때에만 실행 권한 설정 가능

    s : 실행 권한에 UID 또는 GID 설정

    t : 프로그램의 텍스트를 저장

    u : 소유자의 권한을 설정

    g : 그룹의 권한을 설정

    o : 다른 사용자의 권한을 설정

$ chmod o+r newfile

$ chmod u-x newfile


-R 옵션은 recursive 하게 변경 작업을 수행한다.

파일 이름을 지정할 때 와일드카드를 사용할 수도 있다.



* 소유권 변경하기


-

chown 명령으로 파일의 소유자를 chgrp 명령으로 파일의 기본 그룹을 변경할 수 있다.

$ chown options new_owner[.new_group] file

$ chown new_user newfile

$ chown new_user.new_group newfile

$ chown .new_group newfile



-

리눅스 시스템은 사용자의 로그인 이름과 일치하는 개별 그룹 이름을 사용하는 경우 한 가지 항목으로 둘 모두를 변경할 수도 있다.

$ chown test. newfile # user 이름과 group 이름 모두 test 이다.



-

-R 로 recursive 하게 적용도 가능하며, 와일드카드 문자를 사용할 수도 있다.

-h 옵션은 파일에 심볼릭 링크된 모든 파일의 소유권까지 함께 변경한다.



-

root 사용자는 파일의 소유자를 바꿀 수 있다.

어떤 사용자든 파일의 기본 그룹을 바꿀 수 있지만 해당 사용자는 이 파일의 원래 그룹 및 바꾸려는 그룹의 구성원이어야 한다.



-

$ chgrp new_group newfile

그룹을 변경할 수 있기 위해서는 사용자 계정은 파일을 소유하고 있어야 하며, 새로운 그룹의 구성원이어야 한다.




파일 공유하기


-

다른 사람이 파일에 접근할 수 있도록 하려면 보안 그룹의 보안 권한을 모든 사용자로 변경하거나 다른 사용자를 포함하는 다른 그룹으로 파일의 기본 그룹을 지정해야 한다.

리눅스는 각 파일 및 디렉토리에 추가로 세 개의 비트의 정보를 저장한다.


세트 사용자 ID (SUID) : 사용자가 파일을 실행할 때 프로그램은 파일 소유자의 권한 아래서 구동됨

세트 그룹 ID (SGID) : 프로그램은 파일 그룹의 권한 아래에서 구동(파일), 디렉토리에 새로운 파일이 만들어졌을 때 이 디렉토리 그룹을 기본 그룹으로 함(디렉토리)

스티키 비트(sticky bit) : 프로세스가 끝난 후 파일은 메모리에 남아 있음


SGID 비트는 파일 공유에 중요하다.

SGID 비트를 사용하도록 설정하면 공유 디렉토리에 만들어지는 새 파일 전부는 그 디렉토리의 그룹 및 각 사용자의 그룹이 소유하도록 강제할 수 있다.

SGID 는 chmod 명령을 사용하여 설정된다.


binary : octal : 의미

b000 : 00 : 모든 비트 해제

b001 : 01 : 스티키 비트 설정

b010 : 02 : SGID 비트 설정

b011 : 03 : SGID 및 스티키 비트 설정

b100 : 04 : SUID 비트 설정

b101 : 05 : SUID 및 스티키 비트가 설정

b110 : 06 : SUID 및 SGID 비트가 설정

b111 : 07 : 모든 비트가 설정



-

공유 디렉토리를 만들기 위해 해야 할 일은 디렉토리에 대한 SGID 를 설정하는 것이 전부다.

$ mkdir testdir

$ chgrp shared testdir

$ chmod g+s testdir

$ umask 002




반응형

댓글