Linux 사용자와 그룹 관리 완벽 이해: 파일 권한, 소유권, sudo와 Root 권한까지
Linux 서버를 운영하다 보면 “파일이 있는데 왜 수정할 수 없는가?”, “왜 Permission denied가 발생하는가?”, “어떤 사용자가 이 파일을 실행할 수 있는가?“와 같은 문제를 자주 만나게 됩니다.
이러한 문제를 해결하기 위해서는 Linux의 사용자(User), 그룹(Group), 파일 권한(Permission), 소유권(Ownership), 그리고 Root 권한에 대한 이해가 반드시 필요합니다.
특히 시스템 엔지니어에게 Linux 권한 관리는 단순한 기능이 아니라 서버 보안의 핵심입니다. 모든 사용자가 Root 권한을 가지고 있다면 실수 한 번으로 시스템 전체가 손상될 수 있으며, 반대로 권한을 지나치게 제한하면 정상적인 서비스 운영이 어려워질 수 있습니다.
따라서 Linux에서는 필요한 사용자에게 필요한 권한만 제공하는 최소 권한 원칙(Principle of Least Privilege)을 적용하는 것이 중요합니다.
이번 글에서는 Linux 사용자와 그룹을 생성하고 관리하는 방법부터 파일 권한과 소유권, sudo, su, Root 계정의 차이까지 시스템 엔지니어가 실무에서 반드시 알아야 할 내용을 정리하겠습니다.
Linux는 여러 사용자가 동시에 하나의 시스템을 사용할 수 있도록 설계된 다중 사용자 운영체제입니다.
서버에서는 실제 사람이 로그인하는 사용자뿐만 아니라 서비스 실행을 위한 사용자도 존재합니다.
예를 들어 웹 서버에서는 다음과 같은 계정이 사용될 수 있습니다.
root
nginx
apache
postgres
redis
이러한 계정은 각각 특정 프로그램이나 서비스를 실행하기 위해 사용됩니다.
사용자 목록은 /etc/passwd 파일에 저장됩니다.
cat /etc/passwd
예를 들어 다음과 같은 형태를 볼 수 있습니다.
admin:x:1000:1000:Admin:/home/admin:/bin/bash
각 항목은 콜론(:)으로 구분됩니다.
일반적으로 다음과 같은 정보를 포함합니다.
사용자명
비밀번호 관련 정보
UID
GID
설명
홈 디렉터리
로그인 쉘
Linux에서는 사용자의 이름을 그대로 권한 판단에 사용하는 것이 아니라 숫자로 된 ID를 사용합니다.
사용자를 식별하는 번호가 UID(User ID)입니다.
그룹을 식별하는 번호는 GID(Group ID)입니다.
현재 사용자의 UID와 GID를 확인하려면 다음 명령어를 사용합니다.
id
예를 들어 다음과 같은 결과가 나올 수 있습니다.
uid=1000(admin) gid=1000(admin) groups=1000(admin)
여기서 uid=1000은 사용자의 ID이고 gid=1000은 기본 그룹의 ID입니다.
Linux 시스템에서는 권한 검사를 수행할 때 이러한 UID와 GID를 기반으로 판단합니다.
새로운 사용자를 생성할 때는 useradd를 사용할 수 있습니다.
sudo useradd admin
홈 디렉터리를 함께 생성하려면 다음과 같이 사용하는 것이 일반적입니다.
sudo useradd -m admin
로그인 쉘까지 지정할 수도 있습니다.
sudo useradd -m -s /bin/bash admin
사용자에게 비밀번호를 설정합니다.
sudo passwd admin
실제 서버에서는 사용자 생성 후 정상적으로 로그인할 수 있는지 확인하는 과정도 필요합니다.
사용자 삭제에는 userdel을 사용합니다.
sudo userdel admin
홈 디렉터리까지 삭제하려면 다음과 같이 할 수 있습니다.
sudo userdel -r admin
다만 운영 서버에서는 사용자를 바로 삭제하기 전에 해당 사용자가 소유한 파일이나 실행 중인 프로세스가 있는지 확인해야 합니다.
사용자가 퇴사하거나 시스템 접근 권한을 제거해야 하는 경우에도 무조건 계정을 삭제하기보다 먼저 계정을 잠그는 방법을 고려할 수 있습니다.
사용자 계정을 잠그려면 다음 명령어를 사용할 수 있습니다.
sudo passwd -l admin
잠금 해제는 다음과 같습니다.
sudo passwd -u admin
운영 환경에서는 퇴직자나 장기간 사용하지 않는 계정의 접근을 차단하는 데 활용할 수 있습니다.
다만 SSH 키 기반 인증이나 다른 인증 설정이 있는 경우에는 별도의 점검이 필요합니다.
그룹(Group)은 여러 사용자를 하나의 권한 단위로 묶는 기능입니다.
예를 들어 개발팀 사용자가 다음과 같이 있다고 가정해 보겠습니다.
kim
lee
park
이들을 developers라는 그룹에 포함시키면 특정 디렉터리에 그룹 단위 권한을 부여할 수 있습니다.
그룹을 생성합니다.
sudo groupadd developers
사용자를 그룹에 추가합니다.
sudo usermod -aG developers kim
여기서 -aG는 기존 그룹을 유지하면서 새로운 보조 그룹을 추가한다는 의미입니다.
현재 사용자가 속한 그룹을 확인하려면
groups
또는
id
를 사용합니다.
Linux의 모든 파일과 디렉터리에는 소유자와 그룹이 존재합니다.
다음 명령어를 실행해 보겠습니다.
ls -l
예시:
-rw-r--r-- 1 admin developers 1024 Aug 10 config.conf
여기서 중요한 부분은 다음과 같습니다.
admin developers
첫 번째 admin은 파일 소유자이고 두 번째 developers는 파일이 속한 그룹입니다.
즉 이 파일은 admin 사용자가 소유하고 있으며 developers 그룹과 연결되어 있습니다.
파일 소유자를 변경하려면 chown을 사용합니다.
sudo chown admin config.conf
사용자와 그룹을 동시에 변경할 수도 있습니다.
sudo chown admin:developers config.conf
디렉터리와 그 내부 파일까지 변경하려면 -R 옵션을 사용합니다.
sudo chown -R admin:developers /data/project
하지만 -R 옵션은 매우 주의해서 사용해야 합니다.
운영 시스템의 /etc, /usr, /var 등의 중요 디렉터리에 잘못 적용하면 서비스 장애가 발생할 수 있습니다.
Linux에서 가장 중요한 개념 중 하나가 파일 권한입니다.
다음 결과를 살펴보겠습니다.
-rwxr-xr--
Linux 권한은 기본적으로 세 그룹으로 나뉩니다.
소유자(User)
그룹(Group)
기타 사용자(Others)
그리고 각각에 대해 다음 세 가지 권한이 존재합니다.
r = read
w = write
x = execute
따라서
rwxr-xr--
를 해석하면 다음과 같습니다.
소유자 : rwx
그룹 : r-x
기타 : r--
즉 소유자는 읽기, 쓰기, 실행이 모두 가능하고 그룹은 읽기와 실행만 가능하며 기타 사용자는 읽기만 가능합니다.
파일에서 각각의 권한은 다음과 같은 의미를 가집니다.
r은 파일 내용을 읽을 수 있는 권한입니다.
w는 파일 내용을 수정할 수 있는 권한입니다.
x는 파일을 실행할 수 있는 권한입니다.
예를 들어 Shell 스크립트가 있다고 가정해 보겠습니다.
ls -l backup.sh
실행 권한이 없다면 다음과 같은 오류가 발생할 수 있습니다.
Permission denied
실행 권한을 추가합니다.
chmod +x backup.sh
이제 실행할 수 있습니다.
./backup.sh
디렉터리의 r, w, x는 파일과 조금 다르게 이해해야 합니다.
디렉터리에서 r은 내부 파일 목록을 확인할 수 있는 권한입니다.
w는 파일이나 디렉터리를 생성하거나 삭제할 수 있는 권한과 관련됩니다.
x는 해당 디렉터리에 접근하거나 내부 항목에 접근할 수 있는 권한입니다.
따라서 디렉터리에서는 x 권한이 특히 중요합니다.
예를 들어 디렉터리에 읽기 권한이 있더라도 실행 권한이 없다면 해당 디렉터리 내부의 파일에 정상적으로 접근하지 못할 수 있습니다.
Linux에서는 권한을 숫자로 표현할 수도 있습니다.
각 권한은 다음 값을 사용합니다.
r = 4
w = 2
x = 1
따라서
rwx = 7
rw- = 6
r-x = 5
r-- = 4
예를 들어 다음 명령어는
chmod 755 script.sh
다음 권한을 의미합니다.
소유자 : rwx = 7
그룹 : r-x = 5
기타 : r-x = 5
즉 755입니다.
일반적인 설정 파일은 다음과 같이 사용할 수 있습니다.
chmod 644 config.conf
의미는 다음과 같습니다.
소유자 : rw-
그룹 : r--
기타 : r--
Linux를 처음 배우는 과정에서 흔히 사용하는 명령어가 다음과 같습니다.
chmod 777 file
하지만 운영 서버에서는 777 권한을 무분별하게 사용하는 것을 피해야 합니다.
777은 소유자, 그룹, 기타 사용자 모두에게 읽기, 쓰기, 실행 권한을 제공합니다.
즉 누구나 파일을 수정하거나 실행할 수 있는 상황이 될 수 있습니다.
웹 서버에서 파일 권한 문제가 발생했다고 해서 무조건 다음과 같이 해결하는 것은 올바른 방법이 아닙니다.
chmod -R 777 /var/www
이러한 방식은 보안 취약점을 만들 가능성이 높습니다.
먼저 어떤 사용자와 그룹이 해당 파일을 사용해야 하는지 확인하고 필요한 최소 권한만 부여해야 합니다.
새로운 파일이나 디렉터리가 생성될 때 기본 권한을 결정하는 요소가 umask입니다.
현재 umask 확인:
umask
예를 들어
0022
와 같이 표시될 수 있습니다.
umask는 새로 생성되는 파일과 디렉터리에 적용되는 기본 권한에서 제한할 권한을 지정합니다.
Linux에서는 파일과 디렉터리를 생성할 때 기본 권한이 동일하게 적용되는 것이 아니라 실행 권한 등에 대한 차이가 존재합니다.
따라서 서버 보안 정책을 구성할 때 umask를 이해하는 것이 중요합니다.
sudo는 일반 사용자가 특정 명령어를 관리자 권한으로 실행할 수 있도록 하는 기능입니다.
예를 들어 일반 사용자가 패키지를 설치하려면 다음과 같이 사용할 수 있습니다.
sudo dnf install nginx
서비스를 재시작할 때도
sudo systemctl restart nginx
와 같이 사용할 수 있습니다.
sudo의 장점은 사용자가 모든 작업을 Root 권한으로 실행하는 것이 아니라 필요한 명령어에만 관리자 권한을 부여할 수 있다는 것입니다.
Linux의 root는 시스템에서 가장 강력한 권한을 가진 사용자입니다.
Root는 일반적으로 다음과 같은 작업을 수행할 수 있습니다.
시스템 파일 수정
사용자 생성 및 삭제
패키지 설치
서비스 관리
파일 권한 변경
네트워크 설정 변경
디스크 관리
프로세스 관리
하지만 강력한 권한은 동시에 큰 위험을 의미합니다.
예를 들어 다음 명령어를 Root 권한으로 잘못 실행하면 시스템 데이터가 손상될 수 있습니다.
rm -rf
따라서 실무에서는 가능한 한 일반 사용자로 로그인하고 필요한 작업에만 sudo를 사용하는 것이 권장됩니다.
su는 다른 사용자로 전환하는 명령어입니다.
Root 사용자로 전환하는 경우:
su -
반면 sudo는 특정 명령어를 관리자 권한으로 실행합니다.
sudo systemctl restart nginx
둘의 차이를 간단히 정리하면 다음과 같습니다.
|
구분 |
su |
sudo |
|---|---|---|
|
목적 |
사용자 전환 |
특정 명령 권한 상승 |
|
사용 방식 |
다른 계정으로 전환 |
필요한 명령만 실행 |
|
보안 측면 |
장시간 Root 사용 가능 |
최소 권한 운영에 유리 |
|
실무 활용 |
제한적인 상황 |
일반적인 서버 관리 |
현대적인 Linux 서버 운영에서는 일반 사용자 계정 + sudo 방식이 많이 사용됩니다.
sudo 권한은 /etc/sudoers 파일을 통해 관리됩니다.
직접 파일을 편집하기보다는 다음 명령어를 사용하는 것이 안전합니다.
sudo visudo
특정 사용자에게 sudo 권한을 부여하는 방법은 Linux 배포판과 정책에 따라 다릅니다.
Rocky Linux 계열에서는 일반적으로 관리자 그룹 또는 wheel 그룹을 활용합니다.
예를 들어 사용자를 wheel 그룹에 추가할 수 있습니다.
sudo usermod -aG wheel admin
이후 해당 사용자가 sudo를 사용할 수 있도록 시스템의 sudo 정책이 구성되어 있는지 확인해야 합니다.
Linux 서버에서 매우 흔한 장애가 다음과 같은 메시지입니다.
Permission denied
이 문제가 발생하면 무조건 chmod 777을 실행해서는 안 됩니다.
다음 순서로 확인하는 것이 좋습니다.
첫 번째, 현재 사용자 확인
whoami
두 번째, 파일 권한 확인
ls -l config.conf
세 번째, 파일 소유자 확인
stat config.conf
네 번째, 디렉터리 권한 확인
ls -ld /data/project
다섯 번째, 필요하다면 그룹 권한을 확인합니다.
id
여섯 번째, 필요한 경우 소유권을 수정합니다.
sudo chown admin:developers config.conf
마지막으로 필요한 최소 권한을 설정합니다.
chmod 640 config.conf
이러한 방식으로 원인을 분석하는 것이 올바른 서버 운영 방법입니다.
예를 들어 Nginx가 특정 파일을 읽지 못한다고 가정해 보겠습니다.
다음과 같은 구조가 있다고 하겠습니다.
/data/web/
├── index.html
├── css/
└── images/
이때 중요한 것은 파일 자체의 권한뿐만 아니라 /data, /data/web 등 상위 디렉터리를 웹 서버 프로세스가 통과할 수 있는 권한도 가지고 있어야 한다는 것입니다.
따라서 다음과 같이 단계적으로 확인해야 합니다.
ls -ld /data
ls -ld /data/web
ls -l /data/web/index.html
웹 서버 프로세스의 실행 사용자도 확인해야 합니다.
ps -ef | grep nginx
이처럼 Linux 권한 문제는 파일 하나만 확인해서 해결되지 않는 경우가 많습니다.
Linux 서버의 권한 관리는 다음 원칙을 기준으로 하는 것이 좋습니다.
첫째, Root 계정을 일상적인 작업에 사용하지 않습니다.
둘째, 일반 사용자 계정으로 로그인하고 필요한 경우 sudo를 사용합니다.
셋째, 사용자에게 필요한 최소한의 권한만 제공합니다.
넷째, chmod 777을 문제 해결 방법으로 습관적으로 사용하지 않습니다.
다섯째, 서비스별 전용 계정을 사용하는 것을 고려합니다.
여섯째, 파일의 소유자와 그룹을 명확하게 관리합니다.
일곱째, 사용하지 않는 계정과 불필요한 권한은 정기적으로 점검합니다.
이러한 원칙은 Linux 서버의 보안 수준을 높이는 가장 기본적인 방법입니다.
Linux의 사용자, 그룹, 파일 권한과 소유권은 서버 운영의 가장 중요한 기본 지식 중 하나입니다.
사용자는 UID로 식별되고 그룹은 여러 사용자의 권한을 관리하는 단위로 사용됩니다. 파일과 디렉터리는 소유자와 그룹을 가지고 있으며 r, w, x 권한을 통해 접근 범위를 제어합니다.
chmod는 권한을 변경하고 chown은 소유자와 그룹을 변경합니다. usermod는 사용자의 그룹이나 계정 설정을 관리하며 sudo는 일반 사용자가 필요한 작업에 한해서 관리자 권한을 사용할 수 있도록 합니다.
특히 시스템 엔지니어에게 중요한 것은 Root 권한을 무조건 많이 사용하는 것이 아니라 필요한 권한만 정확하게 사용하는 것입니다.
서버 운영 중 Permission denied 오류가 발생했을 때도 단순히 권한을 777로 변경하는 것이 아니라 사용자, 그룹, 파일 권한, 디렉터리 권한, 프로세스 실행 계정을 단계적으로 확인해야 합니다.
Linux 권한 관리를 제대로 이해하면 서버 보안뿐만 아니라 장애 대응 능력도 크게 향상됩니다.