[linux] chown과 chmod로 파일과 하위 디렉토리의 소유권과 권한 변경하기
chown과 chmod 두 커맨드는 밀접하게 연관되어 있고, 리눅스 시스템에서 파일과 디렉토리에 접근하는 권한을 관리하는 명령어입니다.
소유권과 권한은 파일과 폴더에 접근하거나, 앱을 설치, 실행하는 사용자 동작에 직접 영향을 미치기 때문에 소유권을 바꾸거나 권한을 부여하는 두 커맨드는 사용 빈도가 매우 높습니다.
윈도우 운영체제와 달리 리눅스는 계정 기반의 접근 제어가 이루어지기 때문에 계정별 소유권과 권한이 매우 중요하고 리눅스 사용에 있어서 필수인 커맨드입니다.
- chown은 CHange OWNer의 약자입니다. 파일과 디렉토리의 소유자를 변경합니다.
- chmod는 Change MODe의 약자입니다. 파일이나 디렉토리의 읽기, 쓰기, 실행(실행 가능한 파일) 권한을 변경합니다. 리눅스에서는 이런 권한을 MODE라고 합니다.
파일 소유와 권한의 개념
디렉토리 목록을 출력하면 다음처럼 파일, 디렉토리 목록과 함께 여러가지 정보가 함께 표시됩니다. 이 정보들이 어떤 의미인지를 먼저 이해해해야 소유권과 권한 정보를 관리할 수 있습니다.
apost@apost:~$ ls -al
total 188
drwxr-x--- 19 apost apost 4096 1월 13 05:59 .
drwxr-xr-x 5 root root 4096 1월 12 23:07 ..
-rw------- 1 apost apost 4435 1월 12 20:26 .bash_history
-rw-rw-r-- 1 apost apost 3142 1월 10 18:39 .bashrc
drwx------ 17 apost apost 4096 1월 9 17:52 .cache
-rw-r--r-- 1 apost apost 73030 10월 23 10:20 MOP.pdf
drwxrwxr-x 2 apost apost 4096 1월 13 05:58 images
-rwxrwxr-x 1 apost apost 29 1월 8 19:01 script.sh
drwxr-xr-x 2 apost apost 4096 4월 18 2023 다운로드
목록의 정보들이 표시하는 정보중 파일과 디렉토리의 소유권과 권한에 대한 정보는 다음과 같습니다.
- 파일/디렉토리: 파일인지 디렉토리인지 구분하는 플래그입니다. "d"로 표시되면 디렉토리, 일반 파일은 -로 표시합니다. 특수한 용도로 사용하는 시스템 파일에는 s가 사용됩니다.
- 하위 파일/디렉토리 개수: 파일이면 1, 디렉토리이면 디렉토리 안에 몇 개의 파일과 디렉토리가 있는지 숫자로 개수를 표시합니다.
- 권한정보: 파일, 또는 디렉토리의 접근 권한 정보를 표시합니다. 권한 값은 소유자, 그룹, 그외 3가지로 구분되며, "rwxrwxrwx" 처럼 세 개의 알파벳(rwx) 세 개로 모든 권한 정보를 표현할 수 있습니다.
- 소유권: 파일, 또는 디렉토리의 소유자 정보를 표시합니다. 소유자는 소유자 아이디로 소유권을 표시하며, 리눅스는 접근 제어를 그룹 단위로 하기 때문에 소유자가 속한 그룹명을 함께 표시합니다. 소유자 그룹은 임의로 설정하는 것이 아니라 소유자가 속한 그룹을 표시하는 것입니다.
목록에 표시되는 권한정보는 "rwx" 세 개의 알파벳으로 표현됩니다.
- r: 읽기 권한
- w: 쓰기 권한
- x: 실행 권한(바이너리, 또는 실행 가능한 스크립트)
소유자 + 그룹 + 그외 세 가지로 권한 정보를 표현하므로 모든 사용자에게 모든 권한을 허용하려면 "rwxrwxrwx"로 표시하면 됩니다.
권한정보는 2진수 플래그(0, 또는 1)로 각각의 권한을 표시합니다. "rwx"는 2진수 표현으로는 "111"이 됩니다. 파일을 읽을 수 있고 실행할 수 있지만, 수정은 할 수 없도록 하려면 "r-x" 권한을 부여하면 되고, 2진수로 "101"이 됩니다.
이진수 표현은 8진수로 표현하면 0~7까지의 숫자가 됩니다. 7은 "rwx"가 되고, 모든 권한을 부여합니다.
따라서 파일, 또는 디렉토리의 권한 정보는 최대 7까지의 8진수 숫자 3자리로 표현할 수 있습니다.
권한의 종류와 표현 숫자 값을 요약해서 표현하면 다음과 같습니다.
8진수 표현이라고 하지만, 2진수 3자리 표현이기 때문에 7까지만 숫자가 있어서 결과는 10진수 표현과 동일합니다.
chown으로 파일 소유권 변경
파일의 소유자를 변경하는 것은 파일의 권한을 변경할 수 있는 권한을 다른 사용자에게 넘기는 것입니다. 루트 권한 사용자가 아닌 일반 계정의 사용자는 파일의 소유권을 가지고 있어야 파일의 권한 설정을 변경할 수 있습니다.
주의할 점이 있습니다. 내가 소유권을 가지고 있다고 소유자 권한이 무조건 "rwx", 즉 모든 권한을 가지는 것은 아닙니다. 루트 권한 사용자, 또는 자신이 자신의 파일에 대한 권한을 일부 제한할 수도 있습니다. 내 파일이지만 나는 읽을 수 없게 권한을 제한할 수도 있습니다.
윈도우 사용자에게는 약간 어려운 부분이지만, 보안상 내 소유의 파일에 대한 권한 제한이 필요할 때가 있습니다.
처음의 목록에서 MOP.pdf 파일은 나에게 소유권이 있습니다. 내가 속한 그룹원들은 읽을 수만 있고, 그 외의 계정은 파일에 접근할 수 없습니다.
이 파일을 user1 계정으로 소유권을 넘겨서 user1 계정과 user1이 소유한 계정 그룹에서 읽을 수 있도록 chown으로 소유권을 넘겨보겠습니다.
sudo chown user1:user1 MOP.pdf
소유권이 바뀌고 나면 내 홈 디렉토리 밑에 있는 파일이지만 나는 이 파일에 접근할 수 없게 됩니다.(Permission denied 에러 발생)
-rw-r--r-- 1 user1 user1 73030 10월 23 10:20 MOP.pdf
chmod로 권한 변경
파일의 소유권을 변경하는 것보다는 내 그룹원, 또는 그 외의 다른 사용자에게 내 파일에 접근하는데 필요한 일부 권한을 부여해서 사용할 수 있도록 하는 방법이 더 좋은 방법입니다.
내 홈 디렉토리 안에 다른 소유자의 파일이 존재하는 것은 어떻게 봐도 이상할 뿐만 아니라 내 홈 디렉토리 안의 파일을 관리할 때도 불편함이 생기게 됩니다.
소유권이 변경되면 새로운 소유자가 파일을 이동해가는게 정상이겠지만, 어쨋든 소유권 변경보다는 권한을 부여해서 접근을 제어하는 방식이 더 세련된 방식입니다.
chomd 커맨드는 커맨드 뒤에 3개의 파트가 오게 됩니다.
리눅스에서는 권한 정보를 모드라고 한다고 앞서 설명을 했습니다. 그리고 chmod 커맨드는 커맨드 실행을 하는 방식에 대한 실행 "옵션"이 있습니다. 그래서 다음 형식으로 커맨드를 작성하게 됩니다.
chmod [실행옵션] [권한모드] 대상파일[또는 디렉토리]
예를 들면 다음과 같이 커맨드를 사용합니다.
chmod o+r script.sh
chmod 744 script.sh
첫 번째 방식보다는 두 번째 8숫자 권한 표현 방식을 주로 사용합니다. 첫 번째 방식에 대해서는 소개를 하지만 기본적으로 두 번째 방식으로 사용한다고 생각하면 됩니다.
chmod 실행 옵션
실행 옵션은 -R만 중요하고 나머지는 출력 메시지와 관련된 부수적인 옵션입니다. 디렉토리를 지정하면 디렉토리 하위의 파일과 하위 디렉토리까지 모드가 설정됩니다.
chmod -R 764 images
사용할 때 주의해서 사용해야 합니다. 하위 디렉토리 안에 여러가지 권한이 섞인 파일, 또는 디렉토리가 있는 경우 권한 변경으로 인해 이 권한 값들이 모두 리셋되게 되고, 백업 파일이 없으면 권한 설정 정보를 다시 복구할 수 없습니다.
- -R: 파일과 하위 디렉토리의 권한 정보를 일괄 변경
- -c: 변경된 내용이 있을 때만 내용 출력
- -f: 메시지 미출력
- -v: 각각의 파일에 모드 변경을 할 때마다 진행 내용을 출력
chmod 알파벳 권한 모드
자세한 8진수 권한 표현과 권한 설정은 앞에서 설명했으므로 생략하고 알파벳으로 권한 설정을 표현하는 방법을 추가로 알아보겠습니다.
알파벳 권한 설정은 "누구에게, 어떤 권한을, 추가/삭제한다"를 알파벳과 "+/-" 부호로 표시하는 방식입니다.
쉽게 chmod 커맨드의 알파벳 권한 모드는 알파벳 문자(r, w, x) 앞에 "+", 또는 "-"를 붙여서 권한을 추가하거나 빼게 됩니다. "+r"은 읽기 모드를 추가하며, "-r"은 읽기 모드를 삭제합니다.
권한은 다음 3가지로 구분됩니다.
- r: 읽기(Read)
- w: 쓰기(Write)
- x: 실행(eXecute) - 디렉토리일 경우에는 디렉토리 검색
여러 개의 권한을 한꺼번에 부여하려면 "+r-w+x"처럼 연달아 작성합니다. 권한을 변경하지 않는 모드는 표시할 필요가 없습니다.
여러 가지 권한을 권한 추가, 또는 삭제할 때는 묶어서 부호를 표시할 수 있습니다. "+rwx", "+rw-x"와 같은 표현이 가능합니다.
권한을 변경하려면 권한을 변경하는 대상을 지정하는 모드 대상을 함께 표시해야 합니다. 즉, "권한 변경 대상"+"변경 권한"을 조합해서 모드 표현을 해야 합니다. 권한 변경 대상에는 +/- 부호가 붙지 않습니다.
대상은 3가지로 구분되며, 모든 사용자를 가리키는 "a"가 추가로 있습니다.
- u: user. 소유자
- g: group. 그룹
- o: others. 소유자와 그룹 멤버를 제외한 나머지
- a: all. 모두(소유자+그룹+그외)
권한 대상은 여러 개를 한꺼번에 표시할 수 있습니다. 모든 사용자에게 파일의 읽기 권한을 부여하려면 "ugo+r"와 같이 대상을 한꺼번에 나열할 수 있습니다.
소유자 그룹원들에게 읽기 권한을 부여하고, 쓰기 권한은 모두 삭제하려면 "g+r-w"로 작성합니다.
모든 사용자에게 읽기 권한을 부여하려면 "a+r"로 권한 모드를 사용할 수 있습니다. 권한 대상 표현을 할 때 "a"는 생략할 수 있습니다. 즉, 권한을 부여하는 대상이 명시되지 않으면 "a"가 됩니다. 다음 커맨드는 script.sh 파일에 모든 사용자가 수정할 수 있는 권한을 부여합니다.
chmod +w script.sh
앞서의 커맨드는 다음과 같습니다.
chmod ugo+w script.sh
알파벳 권한 모드를 설정할 때는 추가/삭제한 권한만 변경되며, 수정하지 않은 다른 권한들은 그대로 상태가 유지된다는 점을 주의해야 합니다.
알파벳 표현 방식 권한 모드보다는 8진수 숫자로 표현하는 권한모드를 주로 사용하며, 알파벳 표현과 달리 8진수 표현은 소유자, 그룹, 그외 계정 전체에 대한 권한을 한꺼번에 설정합니다.
특수 권한
잘 사용하지 않지만, 정밀한 파일 제어를 해야하는 경우에 사용하는 경우에 사용합니다. 기본적으로 리눅스 파일 시스템은 rwx 권한과 소유자 권한으로 접근과 접근 방식을 제어합니다. 파일을 읽고, 쓰고, 실행하는 권한만으로도 파일 시스템은 의도한대로 정확하게 관리가 됩니다.
특수 권한은 일반 권한인 rwx와 다른 sst로 표시합니다.
- s: Set-uid. 실행 파일을 실행할 때 소유자 권한으로 실행. 실행 권한이 있지만 실행할 때 내 계정으로 실행되는 것이 아니라 소유자 계정으로 실행되는 것입니다. 실행 가능한 바이너리 파일, 또는 스크립트 파일에 적용합니다.
- s: Set-gid. Set-uid와 유사하며, 실행할 때 소유 그룹 권한으로 실행.
- t: stickybiT. 소유자와 루트 계정만 삭제 및 수정 권한을 가짐. "스티키비트"라고 하며, 특수 디렉토리 생성용입니다. 디렉토리에 스티키비트를 설정하면 디렉토리 안에 누구나 파일을 생성할 수 있고, 소유권도 생성자에게 있지만 수정과 삭제는 본인과 루트 계정만 가능합니다. 아무나 파일을 생성할 수 있지만, 관리자가 아닌 타인이 수정/삭제를 할 수 없는 특수한 디렉토리를 만듭니다.
rwx 권한 모드가 소유자-그룹-그외 권한을 3자리 8진수 표현으로 했다면, 특수 권한을 표현하려면 4자리 8진수로 표현해야 합니다. "1자리 sst 8진수 + 3자리 rwx 8진수" 표현으로 나타냅니다.
chmod 커맨드로 8진수 권한 설정을 할 때 특수 권한은 일반 권한 앞에 표시합니다. 표시하지 않으면 "0"으로 표시한 것과 같습니다. 3자리로 표현한 8진수 권한 "744" 값은 앞에 "0"이 붙은 "0744"와 같습니다. 특수 권한을 설정한 파일의 권한을 변경할 때는 4자리로 권한 모드를 표시해서 특수 권한이 유지되도록 주의해야 합니다.
특수 권한은 일반 권한보다 권한 우선 순위가 있습니다. 스티키비트가 설정된 디렉토리에 일반 쓰기 권한이 있어도 다른 사용자는 파일을 수정/삭제할 수 없습니다.
특수 권한은 8진수로 표현하지만 4(s), 2(s), 1(t)중 한가지 플래그만 사용하며, 적용 대상이 각각 다릅니다. 4(s), 2(s)는 실행 가능한 파일에 대해서 적용하며, 1(t)은 디렉토리에 적용합니다.
실행할 수 없는 일반 파일에 4(s), 2(s) 또는 6 특수 권한을 부여해도 아무런 의미가 없습니다. 마찬가지로 디렉토리가 아닌 일반 파일에 1(t) 특수 권한을 부여해도 아무런 동작을 하지 않습니다.
-rwsrwsrwt 1 apost apost 444 1월 13 03:11 config.development.json*
앞서 배운 알파벳 권한 모드 설정에도 사용할 수 있는 특수 권한 알파벳이 있습니다. 마찬가지로 +/-로 특수 권한을 부여하거나 삭제합니다.
- s: 소유자 권한으로 실행. Set-uid, Set-gid 특수권한 설정. "u+s", "g+s"로 소유자와 그룹에 각각 특수 권한을 추가합니다.
- t: 아무나 생성할 수 있지만, 소유자와 루트 계정만 삭제할 수 있는 특수한 디렉토리로 설정. 스티키비트 특수 권한 설정.
셸에 파일 종류에 따른 컬러링 설정이 된 경우, sst 특수 권한에 따라 파일 배경색을 다르게 해서 특수 권한을 구분할 수 있도록 해줍니다.