해당 포스팅은 William E. Shotts, Jr.의 오픈소스 저서 The Linux Command Line(링크)를 번역한 내용입니다
Identity 바꾸기
다양한 상황에서 다른 사용자의 아이덴티티를 얻는 것이 필요할 때가 있습니다. 종종 슈퍼유저의 권한을 얻어 관리 작업을 하거나 특정 사용자 계정을 테스트 할 때가 있습니다. 다른 사용자로 전환하는 방법에는 세 가지가 있습니다.
- 로그아웃 후 다른 사용자로 다시 로그인
- $\texttt{su}$ 명령어 사용
- $\texttt{sudo}$ 명령어 사용
첫 번째 방법은 이미 알고 있기도 하고 다른 두 방법보다 불편하기 때문에 스킵하도록하겠습니다. 현재 쉘 세션에서 $\texttt{su}$ 명령어를 사용하면 다른 사용자로서 새로운 쉘 세션을 시작하거나 하나의 명령을 실행할 수 있습니다. $\texttt{sudo}$는 관리자가 $\texttt{/etc/sudoers}$ 파일에 기록한 설정에 따라 특정 사용자가 특정 명령을 슈퍼유저 권한으로 실행하도록 하는 명령어입니다. 어떤 명령어를 사용할지는 배포판에 따라 다릅니다. 둘 모두 사용 가능한 배포판일지라도 어느 한쪽이 선호되도록 설정되어있을 것입니다. 먼저 $\texttt{su}$부터 사용해보겠습니다.
$\texttt{su}$ - 쉘을 다른 유저나 다른 그룹 ID로 실행
$\texttt{su}$ 명령어는 다른 유저로서 쉘 세션을 시작하도록 합니다. 명령어의 문법은 다음과 같습니다:
$\texttt{-l}$ 옵션이 주어지면 특정 사용자의 로그인 쉘(login shell)로써 쉘 세션을 시작합니다. 이는 해당 사용자의 환경을 불러오고 작업 디렉토리를 해당 사용자의 홈 디렉토리로 바꾸는 것을 의미합니다. 이것이 우리가 주로 원하는 상황입니다. 사용자가 명시되어있지 않으면 슈퍼유저로 가정합니다. $\texttt{-l}$ 옵션은 주로 줄여서 $\texttt{-}$ 만 입력하여 사용됩니다. 슈퍼유저로서 쉘을 시작하고 싶다면 이렇게 입력하세요:
명령을 실행한 후에는 슈퍼유저의 비밀번호를 묻는 프롬프트가 뜨게 됩니다($\texttt{Password:}$ 부분). 비밀번호를 잘 입력하면 새로운 쉘 프롬프트가 나타나면서 쉘이 슈퍼유저 권한을 가지고(프롬프트에 $\texttt{\$}$ 대신 $\texttt{#}$가 사용됨), 작업 디렉토리도 슈퍼유저의 홈 디렉토리($\texttt{/root}$)로 바뀐 것을 확인할 수 있습니다. 새로운 쉘에 들어가게 되면 슈퍼유저로서 명령을 실행할 수 있습니다. 작업이 끝나면 $\texttt{exit}$을 입력해 원래 사용자로 되돌아올 수 있습니다.
쉘을 새로 시작하는 방법 외에도 $\texttt{-c}$ 옵션을 사용하면 명령 하나만 실행할 수 있습니다.
이렇게 작성하면 명령이 새로운 쉘로 넘어가 실행됩니다. 실행하고자하는 명령은 반드시 따옴표로 감싸주세요. 따옴표로 감싸야 확장이 새로운 쉘에서 일어나게 됩니다.
$\texttt{sudo}$ - 다른 사용자로써 명령 실행
$\texttt{sudo}$는 $\texttt{su}$와 여러모로 비슷하지만 중요한 추가적인 기능들이 몇가지 있습니다. 관리자는 sudo의 설정을 통해 일반 사용자가 제한된 영역에서 다른 사용자(주로 슈퍼유저)로써 명령을 실행하도록 권한을 설정 할 수 있습니다. 또 다른 중요한 차이점은 $\texttt{sudo}$를 사용할 때에는 슈퍼유저의 비밀번호가 요구되지 않는다는 것입니다. $\texttt{sudo}$를 사용할 때에는 현재 사용자의 비밀번호가 요구됩니다. 예를 들어, 우리가 $\texttt{sudo}$ 명령어를 사용해 "backup_script"라는 백업 프로그램을 실행할 수 있도록 설정되어있다고 가정해보겠습니다. $\texttt{sudo}$를 사용하면 다음과 같이 명령이 실행됩니다:
명령을 입력한 후 비밀번호를 요구하는 프롬프트가 띄워지고 인증이 완료되면 명령이 실행됩니다. $\texttt{su}$와 $\texttt{sudo}$의 중요한 한 가지 차이점은 $\texttt{sudo}$는 새로운 쉘을 시작하지도 않고 사용자의 환경을 불러오지도 않는다는 것입니다. 이는 명령을 입력할 때 따옴표로 감쌀 필요가 없다는 것을 의미합니다. 그러나 여러 옵션을 사용함으로써 $\texttt{sudo}$의 작동 방식을 바꿀 수 있습니다. 예를 들어, $\texttt{-i}$ 옵션을 사용하면 슈퍼유저의 권한을 얻어 세션을 시작할 수 있습니다. 자세한 내용은 $\texttt{sudo}$의 매뉴얼 페이지를 살펴보세요.
$\texttt{sudo}$가 어떤 권한을 부여했는지 알기 위해서는 $\texttt{-l}$ 옵션을 사용하여 목록을 조회할 수 있습니다:
우분투와 $\texttt{sudo}$
슈퍼유저의 권한이 필요한 작업을 수행하는 것은 일반 사용자가 자주 난항을 겪는 문제입니다. 소프트웨어를 업데이트하거나, 시스템 설정 파일을 편집하거나, 장치에 접근하는 등의 작업들이 이에 해당합니다. Windows에서는 유저에게 관리자 권한을 줌으로써 이러한 작업들을 할 수 있도록 합니다. 그러나 이는 사용자가 실행한 프로그램에도 똑같은 권한을 주게 됩니다. 대부분은 의도한 상황이지만, 바이러스 같은 의도하지 않은 멀웨어(malware, malicious software)도 컴퓨터에 대한 통제권을 얻게 됩니다.
유닉스에서는 일반 사용자와 관리자 사이에 명확한 권한 차이가 있습니다. 유닉스에서는 필요한 때에만 슈퍼유저 권한을 부여하는 방식을 취하고 있습니다. 이를 위해 $\texttt{su}$와 $\texttt{sudo}$ 명령어가 사용됩니다.
몇 년 전까지만 해도 대부분의 리눅스 배포판은 슈퍼유저 권한을 임시로 부여하기 위해 $\texttt{su}$ 명령어만을 사용했습니다. $\texttt{su}$는 $\texttt{sudo}$와 달리 별도의 설정이 필요 없고 루트 계정을 유지하는 것이 유닉스에서는 일반적이었습니다. 하지만 이런 방식은 문제가 있었습니다. 사용자가 루트 권한을 얻은 후에 계속해서 루트 권한으로 명령을 실행한다는 것이었습니다. "permission denied"라는 귀찮은 메시지를 받지 않기 위해서 과도하게 루트 권한을 사용한 것이죠. 이는 큰 보안 위험을 초래하며, 시스템을 관리하는 바람직한 방법이 아닙니다.
우분투의 개발자들은 다른 방식을 택했습니다. 기본 설정에 따라 우분투는 루트 계정의 비밀번호 설정을 막음으로써 루트 계정으로의 로그인을 비활성화하고 $\texttt{sudo}$를 통해 루트 권한을 부여하게 됩니다. 최초의 사용자 계정은 $\texttt{sudo}$를 통해 전체 슈퍼유저 권한을 얻게되고 필요에 따라 다른 사용자 계정에도 유사한 권한을 부여할 수 있습니다.
$\texttt{chown}$ - 파일 소유자와 그룹 소유자를 변경
$\texttt{chown}$ 명령어는 파일이나 디렉토리의 소유자 혹은 그룹 소유자를 변경하기 위해 사용됩니다. 이 작업에는 슈퍼유저 권한이 필요합니다. $\texttt{chown}$ 명령어의 문법은 다음과 같습니다:
여기서 첫 번째 인자의 문법이 중요합니다. Table 9-7에 몇 가지 예시를 보며 문법을 파악해보세요.
Table 9-7: $\texttt{chown}$ 인자 예시
인자 | 결과 |
$\texttt{bob}$ | 파일의 소유자를 현재 소유자에서 $\texttt{bob}$으로 변경합니다. |
$\texttt{bob:users}$ | 파일의 소유자를 $\texttt{bob}$으로 변경하고, 그룹 소유자를 $\texttt{users}$로 변경합니다. |
$\texttt{:admins}$ | 파일의 그룹 소유자를 $\texttt{admins}$로 변경합니다. |
$\texttt{bob:}$ | 파일의 소유자를 $\texttt{bob}$으로 변경하고, 그룹 소유자를 $\texttt{bob}$이 속한 그룹으로 변경합니다. |
두 명의 사용자를 가정해보겠습니다. $\texttt{janet}$은 슈퍼유저 권한을 가지고 있고, $\texttt{tony}$는 일반 유저입니다. $\texttt{janet}$은 자신의 홈 디렉토리에서 $\texttt{tony}$의 홈 디렉토리에 파일을 복사하려고 합니다. $\texttt{janet}$은 $\texttt{tony}$가 그 파일을 편집할 수 있기를 바라기 때문에 $\texttt{janet}$은 복사된 파일의 소유자를 $\texttt{janet}$에서 $\texttt{tony}$로 변경했습니다.
위 코드에서 $\texttt{janet}$은 텍스트 파일 하나를 토니의 홈 디렉토리에 복사했습니다. 그 위 $\texttt{chown}$ 명령어를 사용해서 파일 소유자 $\texttt{root}$, 파일 소유자 그룹 $\texttt{root}$에서 파일 소유자 $\texttt{tony}$, 파일 소유자 그룹 $\texttt{tony}$로 변경한 것을 확인할 수 있습니다.
첫 번째 $\texttt{sudo}$ 명령에서 비밀번호를 입력한 뒤에는 다음 $\texttt{sudo}$ 명령부터 비밀번호를 요구하지 않았습니다. 이는 $\texttt{sudo}$가 최초 인증 후 타이머가 다 될 때까지 우리를 신뢰하기 때문입니다.
$\texttt{chgrp}$ - 그룹 소유자 변경
예전 버전의 유닉스에서는 $\texttt{chown}$은 파일 소유권만 변경했습니다. 그래서 그룹 소유권 변경을 위해 $\texttt{chgrp}$을 따로 사용했습니다. $\texttt{chown}$과 거의 같은 방식으로 작동하지만 더 제한적이라는 차이점이 있습니다.
권한 행사
접근 권한이 어떻게 작동하는지 배웠으니 이제 실습을 해보겠습니다. 공유 디렉토리 설정에 관련한 문제 상황을 예시로 사용해보겠습니다. "bill"과 "karen"이라는 두 명의 사용자가 있다고 가정하겠습니다. 둘 모두 음악 컬렉션이 있어서 공유 디렉토리를 설정해 각자의 음악 파일을 넣고자 합니다. $\texttt{bill}$은 $\texttt{sudo}$를 통해 슈퍼유저 권한을 얻을 수 있습니다.
가장 먼저 해야할 것은 $\texttt{bill}$과 $\texttt{karen}$이 소속된 그룹을 만들어야 합니다. $\texttt{bill}$은 그래픽 기반 관리 툴을 사용해 $\texttt{music}$이라는 그룹을 만들고 $\texttt{bill}$과 $\texttt{karen}$을 그룹원으로 추가합니다:
다음으로, $\texttt{bill}$은 음악 파일을 담을 디렉토리를 생성합니다.
$\texttt{bill}$은 자신의 홈 디렉토리 바깥에 디렉토리를 만들어야 하므로 슈퍼유저 권한이 필요합니다. 디렉토리가 생성되면 다음과 같은 소유권과 권한을 가집니다:
디렉토리의 소유권은 $\texttt{root}$에게 있고 권한 모드는 755입니다. $\texttt{bill}$은 이 디렉토리가 공유될 수 있도록 그룹 소유권과 그룹 권한을 바꿔 쓰기가 가능하도록 해야합니다.
첫 번째 줄에서는 디렉토리의 그룹 소유자를 $\texttt{music}$으로 변경했습니다. 두 번째에서는 디렉토리의 모드를 775로 변경했습니다. 그룹 $\texttt{music}$에는 $\texttt{bill}$과 $\texttt{karen}$이 소속되어있으니 이제 그들은 $\texttt{/usr/local/share/Music}$ 에 파일과 디렉토리를 추가할 수 있습니다. 이외의 사용자들은 디렉토리의 내용은 볼 수 있지만 파일은 추가할 수 없습니다.
하지막 아직 문제가 남아있습니다. 현재의 $\texttt{Music}$ 디렉토리의 권한 설정으로는 추가된 파일과 디렉토리들이 $\texttt{/Music}$과 다르게 일반적인 권한을 갖게됩니다.
사실 문제는 두 개 있습니다. 첫 번째는 기본 $\texttt{umask}$가 0022로 설정되어있어 다른 그룹 멤버가 만든 디렉토리에 쓰기 권한이 없다는 것입니다. 만약 공유 디렉토리에 파일만 있다면 문제가 되지 않을 것입니다. 그러나 지금 만들고자 하는 건 음악 파일을 담을 디렉토리이고, 보통 음악 파일들은 가수, 앨범 별로 계층적으로 정리되기 때문에 여러 디렉토리가 만들어져야하고 그 디렉토리에 파일이나 하위 디렉토리가 생성될 수 있어야 합니다. 따라서 $\texttt{bill}$과 $\texttt{karen}$의 $\texttt{umask}$를 0002로 변경해야 합니다.
두 번째 문제는 한 멤버가 만든 파일이나 디렉토리의 그룹 소유자가 해당 멤버로 설정된다는 것입니다. 우리가 원하는 것은 파일이나 디렉토리 생성/추가시에 그룹 소유자가 $\texttt{music}$으로 설정되기를 바랍니다. 이는 디렉토리의 setgid bit을 설정함으로써 고칠 수 있습니다.
이제 테스트를 통해 권한 문제가 해결되었는지 확인해보겠습니다. $\texttt{bill}$은 $\texttt{umask}$를 0002로 바꾸고 이전 파일들을 삭제한 후에 새로운 파일과 디렉토리를 생성했습니다.
파일과 디렉토리의 그룹 소유자 모두 생성되면서 $\texttt{music}$의 그룹원들이 접근할 수 있도록 올바르게 설정된 것을 확인할 수 있습니다.
마지막 남은 문제는 $\texttt{umask}$입니다. 터미널 세션이 끝나면 $\texttt{umask}$ 세팅은 다시 리셋됩니다. $\texttt{umask}$를 영구적으로 유지하는 방법에 대해서는 챕터 11에서 다루겠습니다.
비밀번호 변경
마지막으로 다룰 내용은 비밀번호를 변경하는 방법입니다. 비밀번호 변경에는 $\texttt{passwd}$ 명령어가 사용됩니다.
현재 로그인 되어있는 사용자의 비밀번호를 변경하려면 $\texttt{passwd}$만 입력하면 됩니다. 현재 비밀번호와 바꿀 비밀번호를 묻는 프롬프트가 뜰 것입니다.
$\texttt{passwd}$ 명령은 "강력한" 비밀번호를 입력하도록 요구할 것입니다. 너무 짧거나, 이전 비밀번호와 너무 비슷하거나, 사전에 있는 단어나, 너무 쉽게 유추할 수 있는 경우엔 반려될 수 있습니다.
슈퍼유저 권한이 있다면 다른 사용자명을 인자로 전달해 해당 사용자의 비밀번호를 변결할 수 있습니다. 이외에도 슈퍼유저는 계정 잠금, 비밀번호 유효기간 등의 설정을 할 수 있습니다. 자세한 내용은 $\texttt{passwd}$의 매뉴얼 페이지를 확인하세요.
요약
이번 챕터에서는 유닉스 계열 시스템이 어떻게 파일이나 디렉토리의 읽기, 쓰기, 실행 권한을 관리하는지 알아보았습니다. 이런 시스템의 기원은 초기 유닉스까지 거슬러 올라가며 지금까지도 세월의 풍파를 견디고 살아남았습니다. 하지만 유닉스 계열 시스템의 기본 권한 메커니즘이 현대의 다른 시스템들에 비해 세밀함이 부족합니다.
추가 자료
- 멀웨어에 관한 위키피디아:
https://en.wikipedia.org/wiki/Malware
이번 챕터에서 소개한 명령어들 외에도 사용자와 그룹을 추가하고 정비하는 커맨드 라인 프로그램들이 많이 있습니다. 아래 명령어들의 매뉴얼 페이지를 읽어보세요:
- $\texttt{adduser}$
- $\texttt{useradd}$
- $\texttt{groupadd}$
'리눅스 > Part 1 - Learning The Shell' 카테고리의 다른 글
리눅스 기초 | 10-2. 프로세스 (0) | 2024.06.03 |
---|---|
리눅스 기초 | 10-1. 프로세스 (0) | 2024.05.31 |
리눅스 기초 | 9-1. 권한 (0) | 2024.05.29 |
리눅스 기초 | 8. 고급 키보드 트릭 (0) | 2024.05.28 |
리눅스 기초 | 7. 쉘처럼 세상 바라보기 (0) | 2024.05.24 |