0. 들어가기전에
리눅스는 여러 사용자가 로그인해서 사용하는 것을 전제로 만들어졌다. 그래서 다른 사용자가 파일을 함부로 수정하거나 삭제하거나 하는 일이 일어나지 않도록 접근 권한이라는 개념이 있다. 또 관리자 권한을 가지는 슈퍼 사용자 (root user) 도 존재한다.
1. 퍼미션 (Permission)
(1) 퍼미션
각 파일에는 어떤 유저에게 어떤 권한을 주는지에 대한 정보가 설정되어 있는데, 이를 퍼미션 이라고 한다.
ls 명령어에 -l 옵션을 지정하면 확인할 수 있다.
■ 퍼미션 확인하기
$ ls -l
앞에 10글자가 출력되는데 첫 1글자는 파일타입을 의미하며, 뒤 9글자는 파일모드(퍼미션)을 의미한다.
■ 파일타입
표기 | 의미 |
- | 일반 파일 |
d | 디렉토리 |
l | 심볼릭 링크 |
파일모드는 또 3글자씩 소유자의 권한, 소유그룹의 권한, 그외 기타 사용자의 권한. 즉, 각 유저에 대한 퍼미션을 나타낸다.
※ 파일모드 (퍼미션) 예제 : rw-rw-r--
소유자 권한 | 소유그룹 권한 | 기타 사용자 권한 |
rw- | rw- | r-- |
- 소유자 권한 (rw-) : 읽기, 쓰기 가능
- 소유그룹 권한 (rw-) : 읽기, 쓰기 가능
- 기타 사용자 권한 (r--) : 읽기 가능
■ 퍼미션 의미
표기 | 의미 |
r | 읽기 (read) |
w | 쓰기 (write) |
x | 실행 (execute) |
(2) 디렉토리 퍼미션에서의 주의점
디렉토리의 퍼미션도 r, w, x 로 표기가 된다. 다만, 파일과 약간 다른점이 있으니 주의할 필요가 있다.
예제로 살펴보자. 각 디렉토리에 다음과 같이 권한(퍼미션)이 설정되어있다.
디렉토리명 | 권한 | 내용 | 디렉토리 안 | 권한 | 내용 |
dirB | r, w, x | 읽기, 쓰기, 실행 | file1.txt | r, -, - | 읽기 |
study/ | r, w, x | 읽기, 쓰기, 실행 | |||
dirC | -, w, x | 쓰기, 실행 | file2.txt | r, w, - | 읽기, 쓰기 |
읽기 권한(r) 이 없는 디렉토리 dirC 의 파일목록을 확인하기위해 ls 명령어를 실행하면 다음과 같은 메시지가 출력되며 실패한다.
ls: cannot open directory '디렉토리명' : Permission denied
읽기 권한이 없어 디렉토리를 열 수 없다는 의미이다. 즉, 읽기 권한(r) 이 없는 디렉토리의 파일목록을 확인할 수 없다.
디렉토리에 쓰기 권한(w)이 있으면 해당 디렉토리 밑에 파일을 작성하거나 삭제할 수 있다. 쓰기 권한이있는 디렉토리 dirB 아래에 있는 파일 중에 쓰기 권한(w)이 없는 파일 file1.txt 를 삭제하기위해 다음과 같이 rm 명령어를 실행하면 다음과 같은 메시지가 출력된다.
$ rm dirB/file1.txt
rm: remove write-protected regular empty file '삭제하려는파일' ?
쓰기 보호된 파일을 정말 삭제할것인지 묻는 메시지가 출력되며, y 또는 yes 를 입력하면 삭제된다.
여기서 잘 생각해보자.
- dirB : 쓰기 권한(w) 있음
- dirB/file1.txt : 쓰기 권한(w) 없음
rm 명령어로 쓰기 권한(w)이 없는 파일 file1.txt 를 삭제했다. 즉, 디렉토리에 쓰기 권한이 있으면 해당 디렉토리 아래의 파일을 작성하거나 삭제할 수 있다는 점이 주의할 점이다.
정리하면 파일을 생성하거나 삭제 할 수 있는지 여부는 파일의 권한(퍼미션)이 아니라 디렉토리의 권한(퍼미션)에 의해 결정된다는 것이다.
보통 나의 파일을 다른 사용자가 읽을수 있게 하려면 rwxr-xr-x 라는 퍼미션을 설정한다. 파일 소유자는 모든 권한을 가지며, 다른 사용자는 읽기만 가능하도록 하는 것이다. 그리고, rwx------ 으로 설정하면 파일 소유자 외의 다른 사용자는 해당 내용을 알 수 없게 된다.
(3) 파일 모드 변경 명령어 : chmod
파일이나 디렉토리의 권한(퍼미션)을 설정하기 위한 명령어는 chmod 이다. 이때 2가지 방법이 존재하는데, 기호를 사용하는 기호 모드와 수치를 사용하는 수치 모드가 있다.
파일 모드를 변경하는 것은 해당 파일의 소유자 또는 슈퍼 사용자(root user) 만 가능하다.
1) 기호 모드
지정한 권한(퍼미션) 외에는 변경되지 않는다. 선택적으로 퍼미션을 변경하고 싶을때 주로 사용한다.
chmod [ugoa] [+-=] [rwx] <파일명>
■ chmod 명령어 사용자 기호
기호 | 의미 |
u | 소유자 |
g | 소유그룹 |
o | 기타 사용자 |
a | 모두 |
■ chmod 명령어 연산자
기호 | 의미 |
+ | 퍼미션 추가 |
- | 퍼미션 제거 |
= | 지정한 퍼미션으로 설정 |
아래 명령어를 실행하여 결과를 확인해보자.
chmod u+r dirC
chmod g-w FILE-A.txt
chmod a=r testTextFile.txt
- chmod u+r dirC
- 디렉토리 dirC 에 소유자(u)권한으로 읽기(r) 추가
- (전) --xr-xr-x (후) r-xr-xr-x
- chmod g-w FILE-A.txt
- 파일 FILE-A.txt 에 소유자 그룹(g) 권한으로 쓰기 (w) 삭제
- (전) rw-rw-r-- (후) rw-r--r--
- chmod a=r testTextFile.txt
- 파일 textTextFile.txt 에 전체(소유자, 소유자그룹, 기타사용자) 권한으로 읽기(r)만 지정
- (전) -w--w---- (후) r--r--r--
2) 수치 모드
기존 권한(퍼미션)을 새로운 권한(퍼미션)으로 덮어쓰게 된다.
chmod <8진수의 수치> <파일명>
■ chmod 명령어 수치 모드 에서의 퍼미션 수치
의미 | 수치 |
읽기 (r) | 4 |
쓰기 (w) | 2 |
실행 (x) | 1 |
다음과 같은 방법으로 사용한다. 예를들어 rwxr-xr-x 퍼미션은 다음과같이 755가 된다.
사용자 | 소유자 | 소유자 그룹 | 기타 사용자 | ||||||
퍼미션 | r | w | x | r | - | x | r | - | x |
수치 | 4 | 2 | 1 | 4 | 1 | 4 | 1 | ||
수치합 | 7 | 5 | 5 |
다음의 명령어를 실행하여 r--r--r-- 의 퍼미션이 rwxr-xr-x 으로 변경된 것을 확인할 수 있다.
chmod 755 textTextFile.txt
다른예로 소유자는 읽고 쓰기가 가능하고, 그 외 일반 사용자는 읽기만 가능하도록 하는 퍼미션 rw-r--r-- 은 644가 된다.
2. 슈퍼 사용자, 루트 유저 (root user)
(1) 슈퍼 사용자
리눅스에서 관리자 권한을 갖는 사용자를 슈퍼 사용자 또는 루트 사용자 (root user) 라고 한다. 그외 유저는 일반 사용자이다. 슈퍼 사용자는 시스템 설정 파일 변경, 새로운 애플리케이션 설치 등이 가능하며 퍼미션을 무시하고 모든 파일의 읽기나 수정이 가능하다. 즉, 명령어의 사용에 제한이 없다는 의미이다. 따라서 실수로 중요한 파일을 수정하거나 삭제해버릴 위험을 가지고 있으니 평소에는 일반 사용자로 조작하다가 반드시 필요한 특수한 상황에서만 루트 유저를 사용하는 것이 좋다.
(2) 사용자 전환 명령어 : su
일시적으로 다른 사용자로 전환하는 명령어로 su 가 존재한다. 이용중이던 유저의 로그아웃을 하지않고 다른 사용자로 전환하여 사용할 수 있는 명령어이다. 주로 루트 유저로 전환하기위해 사용된다. 보통 보안상의 이유로 루트 유저로 직접 로그인하지 못하도록 설정해놓기 때문이다.
【참고】 우분투 (ubuntu) 의 경우, 처음에는 슈퍼 사용자의 패스워드가 설정되어 있지 않아 바로 su 명령어로 슈퍼사용자로 전환할 수 없다. 따라서 다음과 같이 슈퍼사용자의 패스워드를 설정해야 한다.
■ 슈퍼사용자 패스워드 설정
sudo passwd root
설정할 패스워드를 입력하면 패스워드 설정이 성공되었다는 passwd: password updated successfully 메시지가 출력된다.
■ 사용자 전환 명령어 : su
$ su
su 명령어를 입력하면 패스워드 입력이 출력되며 설정한 패스워드를 입력하면 슈퍼사용자(#) 로 전환된다.
슈퍼 사용자로 로그인되면 프롬프트가 # 으로 바뀐다.
$ → 일반 사용자
# → 슈퍼 사용자
■ 슈퍼 사용자에서 일반 사용자로 전환하기 위한 명령어 : exit
# exit
슈퍼사용자에서 exit 명령어를 입력하여 일반 사용자로 전환되면 프롬프트가 다시 $ 으로 전환된다.
■ 주의점 : 하이픈(-) 붙여서 실행
su 로 전환하면 슈퍼사용자로 전환되었을때, 환경 변수 등이 일반 사용자의 상태로 유지된다는 것이다. 따라서, 슈퍼 사용자의 환경으로 초기화하고 싶으면 다음과 같이 하이픈(-)을 붙여서 실행해야 한다.
$ su -
(3) 다른 사용자가 되어 명령어를 실행하는 명령어 : sudo
sudo 명령어는 다른 사용자가 되어 명령어를 실행할 수 있다. 특정 사용자를 지정하지 않으면 슈퍼 사용자로 명령어를 실행한다. 따라서 주로 일반사용자로 로그인한 뒤 슈퍼 사용자로만 실행할 수 있는 명령어를 실행하기위해 사용한다.
$ sudo <실행할 명령어>
다음의 예제로 확인해보자.
$ sudo cat /etc/shadow
패스워드를 물어보는 메시지가 출력되면, 현재 로그인한 사용자의 암호를 입력하면 된다.
sudo 와 su 는 비슷해 보이지만, sudo는 명령어 한개만 슈퍼 사용자로 실행하기 위한 명령어이다. 따라서 명령어가 실행되면 다시 일반 사용자 ($) 로 돌아온다. exit 로 전환해야하는 su 와는 다르다.
1) sudo 명령어 설정
모든 유저가 sudo 명령어를 사용할 수 있으면 슈퍼 사용자와 일반 사용자가 나누어져 있을 필요가 없다. 그래서 특정 사용자에게만 sudo 명령어를 사용할 수 있도록 설정할 수 있다.
■ sudo 명령어를 이용할 수 있는 사용자 목록 파일 : /etc/sudoers
$ su -
Password:
# cat /etc/sudoers
각 항목은 아래와 같은 형식을 따른다.
<사용자> <머신이름>=(<권한>)<명령어>
여기서 <사용자> 는 일반 사용자 이름 또는 %<사용자그룹명> 으로 지정된다.
일반적으로 설치 직후 다음과 같이 설정되어 있다.
%sudo ALL=(ALL) ALL
또는
%admin ALL=(ALL) ALL
sudo 그룹(관리자)에 속한 사용자는 모든 머신에서 모든 명령어를 실행할 수 있다는 의미이다. 따라서 특정 사용자에게 권한을 부여하려면 슈퍼사용자가 다음과 같이 파일에 지정하면 된다.
(예) 특정사용자 billy 에게 부여
billy ALL=(ALL) ALL
2) sudoers 파일 편집하는 명령어 : visudo
/etc/sudoers 파일을 텍스트 에디터로 단순히 편집하는 것은 위험하다. 오타 등이 발생하면 sudo 명령어 사용에 문제가 발생하기 때문이다. 그래서 sudoers 파일을 보다 안전하게 편집할 수 있는 명령어 visudo 가 존재한다. 이 명령어는 슈퍼 사용자의 권한이 필요하므로 다음과 같이 sudo 명령어를 사용하여 실행하거나 su 로 슈퍼사용자로 전환한 후 실행해야한다.
■ sudoers 파일 편집 명령어
$ sudo visudo
sudoers 파일을 편집하기위한 vi가 기동되며 편집을 수행하면 된다.
(4) su 와 sudo 명령어 중 어떤것을 사용해야 하는가?
su 명령어로 슈퍼사용자로 전환하면 exit 로 일반사용자로 전환하기 전까지 슈퍼사용자의 상태로 유지된다. 반면에 sudo 는 실행한 특정 명령어만을 수행하며 일반사용자 상태이다. 슈퍼 사용자로 조작하다보면 명령어 실행에 제한이 없기때문에 순간의 실수도 반영되어버릴 위험이 항상 존재한다. 따라서 sudo 를 사용하는것이 권장된다.