1. 개요

리눅스는 여러 사람이 한 서버를 함께 쓰는 것을 전제로 만들어진 운영체제다. 그래서 파일 하나, 프로세스 하나에도 “누구의 것인지”가 기록되고, 그 소유자 정보를 기준으로 읽기·쓰기·실행 권한이 결정된다.

1번 글에서 chmod, chown으로 권한과 소유자를 바꾸는 명령을 짧게 다뤘고, SSH 글들에서는 “로그인할 사용자 계정의 authorized_keys“를 여러 번 언급했다. 이번 글에서는 그 기반이 되는 사용자(user)와 그룹(group) 을 직접 만들고, 그룹에 넣고, sudo 권한을 주고, 잠그고 삭제하는 흐름을 Ubuntu 기준으로 정리한다.

글 전체에서 예제 사용자는 devuser, 예제 그룹은 developers를 사용한다.


2. 리눅스 계정의 종류와 UID

리눅스는 사용자를 이름이 아니라 UID(User ID) 라는 숫자로 구분한다. 이름은 사람이 보기 편하도록 붙인 별칭이고, 파일 소유자도 내부적으로는 UID로 저장된다. 그룹도 마찬가지로 GID(Group ID) 로 구분한다.

구분 UID 범위 (Ubuntu 기본값) 설명
root 0 모든 권한을 가진 관리자 계정
시스템 계정 1 ~ 999 www-data, sshd처럼 서비스를 실행하기 위한 계정. 보통 로그인하지 않는다
일반 사용자 1000 이상 사람이 로그인해서 쓰는 계정

현재 로그인한 사용자의 정보는 다음 명령으로 확인한다.

whoami   # 현재 사용자 이름
id       # UID, 기본 그룹(GID), 소속된 모든 그룹

id의 출력은 uid=1000(etakyung) gid=1000(etakyung) groups=1000(etakyung),27(sudo) 같은 형태다. Ubuntu에서 사용자를 만들면 사용자와 같은 이름의 그룹이 함께 만들어지고, 이것이 그 사용자의 기본 그룹(primary group)이 된다. 그 밖에 추가로 소속된 그룹을 보조 그룹(supplementary group)이라고 한다.


3. 계정 정보가 저장되는 파일

사용자와 그룹 정보는 별도의 데이터베이스가 아니라 /etc 아래의 텍스트 파일에 저장된다. 아래 명령들은 결국 이 파일들을 안전하게 수정하는 도구다.

파일 내용 읽기 권한
/etc/passwd 사용자 목록과 기본 정보 모든 사용자
/etc/shadow 암호화된 비밀번호와 비밀번호 만료 정보 root만
/etc/group 그룹 목록과 그룹 구성원 모든 사용자

/etc/passwd

한 줄이 사용자 한 명이고, 7개 필드가 :로 구분된다.

devuser:x:1001:1001:Dev User:/home/devuser:/bin/bash
   ①    ②  ③    ④     ⑤          ⑥           ⑦
번호 필드 의미
① 사용자 이름 로그인에 쓰는 이름
② 비밀번호 x는 실제 비밀번호가 /etc/shadow에 있다는 뜻
③ UID 사용자 번호
④ GID 기본 그룹 번호
⑤ 설명(GECOS) 이름 등 부가 정보
⑥ 홈 디렉토리 로그인 시 처음 위치하는 디렉토리
⑦ 로그인 셸 로그인 후 실행되는 셸. /usr/sbin/nologin이면 로그인할 수 없다

예전에는 이 파일의 두 번째 필드에 비밀번호 해시를 직접 저장했지만, /etc/passwd는 누구나 읽을 수 있어야 하므로 비밀번호만 root 전용 파일인 /etc/shadow로 분리했다.

/etc/group

developers:x:1002:devuser,etakyung

그룹 이름, 비밀번호 자리(x), GID, 그리고 보조 그룹으로 소속된 사용자 목록 순서다. 사용자의 기본 그룹은 /etc/passwd의 GID로 정해지므로 이 목록에는 보통 나타나지 않는다.

특정 사용자나 그룹 한 줄만 보고 싶다면 grep보다 getent를 쓰는 편이 정확하다.

getent passwd devuser
getent group developers

4. 사용자 만들기

Ubuntu에는 사용자를 만드는 명령이 두 가지 있다.

명령 특징
adduser Ubuntu(Debian 계열)가 제공하는 대화형 명령. 홈 디렉토리, 기본 셸, 비밀번호를 차례로 물어보며 설정해 준다
useradd 모든 리눅스 배포판에 있는 저수준 명령. 옵션을 주지 않으면 홈 디렉토리를 만들지 않는 등 설정이 최소한이다

직접 서버에서 한 명을 만들 때는 adduser가 편하다.

sudo adduser devuser

비밀번호와 이름 등을 묻는 질문에 답하면 /home/devuser 디렉토리와 devuser 그룹이 함께 만들어진다.

스크립트처럼 질문 없이 만들어야 할 때는 useradd에 옵션을 명시한다. 이 경우 비밀번호는 passwd로 따로 설정한다.

sudo useradd -m -s /bin/bash -c "Dev User" devuser   # -m: 홈 디렉토리 생성, -s: 로그인 셸, -c: 설명
sudo passwd devuser                                  # 비밀번호 설정

만들어진 결과를 확인한다.

getent passwd devuser
ls -ld /home/devuser
id devuser

홈 디렉토리 안에는 /etc/skel에 있던 .bashrc, .profile 같은 기본 설정 파일이 복사되어 있다. 새 사용자마다 같은 초기 파일을 주고 싶다면 /etc/skel에 넣어 두면 된다.

만든 사용자로 전환해 보려면 su를 사용한다. -를 붙이면 그 사용자의 홈 디렉토리와 환경 변수로 완전히 로그인한 것처럼 전환된다.

sudo su - devuser
whoami    # devuser
exit      # 원래 사용자로 돌아오기

5. 그룹 만들고 사용자 추가하기

그룹은 여러 사용자에게 같은 권한을 한꺼번에 주기 위해 쓴다. 예를 들어 개발자들이 함께 쓰는 디렉토리가 있다면, 사용자마다 권한을 주는 대신 developers 그룹에 권한을 주고 사용자를 그룹에 넣는다.

먼저 그룹을 만든다.

sudo groupadd developers
getent group developers

devuser를 developers 그룹의 보조 그룹 구성원으로 추가한다.

sudo usermod -aG developers devuser
groups devuser
옵션 의미
-G 보조 그룹 목록을 지정
-a 기존 보조 그룹을 유지하고 추가(append)

-a 없이 -G만 쓰면 기존 보조 그룹이 모두 지워지고 지정한 그룹만 남는다. 관리자 계정에 이 실수를 하면 sudo 그룹에서 빠져 관리자 권한을 잃을 수 있으므로 항상 -aG를 함께 쓰는 습관을 들이는 것이 좋다.

그룹 변경은 새로 로그인한 세션부터 적용된다. 이미 로그인한 상태에서 id를 실행하면 새 그룹이 보이지 않는 것이 정상이다. 로그아웃 후 다시 로그인하거나 SSH 접속을 새로 열면 반영된다.

그룹에서 빼거나 그룹을 지울 때는 다음 명령을 사용한다.

sudo gpasswd -d devuser developers   # devuser를 developers 그룹에서 제거
sudo groupdel developers             # 그룹 삭제 (기본 그룹으로 쓰는 사용자가 있으면 실패한다)

그룹으로 공유 디렉토리 만들기

1번 글의 chown, chmod를 그룹과 연결해 보면 그룹이 왜 필요한지 분명해진다. developers 그룹 구성원만 읽고 쓸 수 있는 디렉토리를 만든다.

sudo mkdir -p /srv/dev-share
sudo chown root:developers /srv/dev-share   # 소유자 root, 소유 그룹 developers
sudo chmod 2770 /srv/dev-share              # 소유자·그룹은 rwx, 그 외는 접근 불가
ls -ld /srv/dev-share

권한 앞의 2는 setgid 비트다. 디렉토리에 setgid가 설정되면, 그 안에 새로 만든 파일의 소유 그룹이 만든 사람의 기본 그룹이 아니라 디렉토리의 그룹(developers)으로 정해진다. 그래서 구성원이 만든 파일을 다른 구성원도 그룹 권한으로 다룰 수 있다. ls -ld 결과의 권한이 drwxrws---처럼 그룹 실행 자리에 s로 보이면 setgid가 켜진 것이다.


6. sudo 권한 주기

sudo는 일반 사용자가 명령 하나를 root 권한으로 실행하게 해 주는 도구다. root로 직접 로그인하는 대신 필요한 순간에만 권한을 빌리고, 누가 어떤 명령을 실행했는지 로그에 남는다.

Ubuntu에서는 sudo 그룹 구성원이 모든 명령을 sudo로 실행할 수 있도록 기본 설정되어 있다. 따라서 관리자 권한을 주는 가장 간단한 방법은 sudo 그룹에 추가하는 것이다.

sudo usermod -aG sudo devuser

devuser로 새로 로그인한 뒤 어떤 권한이 있는지 확인한다.

sudo -l

특정 명령만 허용하기

모든 권한이 아니라 일부 명령만 허용하고 싶다면 sudoers 설정을 추가한다. 설정 파일은 직접 편집하지 않고 반드시 visudo로 연다. visudo는 저장하기 전에 문법을 검사하므로, 오타 때문에 sudo 자체가 동작하지 않는 상황을 막아 준다.

/etc/sudoers를 직접 고치기보다 /etc/sudoers.d/ 아래에 파일을 따로 만드는 편이 관리하기 쉽다.

sudo visudo -f /etc/sudoers.d/devuser

예를 들어 devuser에게 nginx 재시작만 허용하려면 다음 한 줄을 적는다.

devuser ALL=(root) /usr/bin/systemctl restart nginx

형식은 사용자 호스트=(실행할 계정) 허용할 명령이다. 명령은 반드시 전체 경로로 적어야 하며, 경로는 which systemctl로 확인할 수 있다.

학습용 VM에서는 sudo 그룹에 넣는 것으로 충분하지만, 여러 사람이 쓰는 실제 서버에서는 필요한 명령만 허용하는 방식이 더 안전하다.


7. 사용자 수정·잠금·삭제

정보 수정

usermod로 이미 만든 사용자의 정보를 바꾼다.

sudo usermod -s /bin/zsh devuser          # 로그인 셸 변경
sudo usermod -c "Developer" devuser       # 설명 변경

비밀번호는 passwd로 바꾼다. 인자 없이 실행하면 자기 비밀번호를, sudo passwd 사용자로 실행하면 다른 사용자의 비밀번호를 바꾼다. 비밀번호 만료 정보는 chage로 확인한다.

sudo chage -l devuser

계정 잠그기

퇴사자나 사용하지 않는 계정은 바로 지우기보다 먼저 잠가 두는 경우가 많다.

sudo passwd -l devuser    # 비밀번호 잠금 (해제: passwd -u)

passwd -l은 /etc/shadow의 비밀번호 해시 앞에 !를 붙여 비밀번호 로그인만 막는다. Ubuntu의 기본 SSH 설정에서는 이 상태에서도 authorized_keys에 등록된 공개키로는 로그인할 수 있다. 4번·11번 글처럼 공개키로 접속하는 서버라면 계정 자체를 만료시켜야 완전히 막힌다.

sudo usermod --expiredate 1 devuser    # 계정 만료 (1970-01-02로 설정되어 즉시 만료)
sudo chage -l devuser                  # Account expires 항목 확인
sudo usermod --expiredate "" devuser   # 만료 해제

사용자 삭제

sudo userdel -r devuser

-r을 붙이면 홈 디렉토리와 메일 스풀까지 함께 삭제한다. 붙이지 않으면 계정만 지워지고 /home/devuser는 남는다. 이때 남은 파일의 소유자는 이름 대신 UID 숫자(1001)로 표시되며, 나중에 같은 UID로 만든 다른 사용자가 이 파일의 소유자가 되어 버릴 수 있다. 필요한 파일은 먼저 백업한 뒤 -r로 지우는 편이 깔끔하다.

현재 로그인 중이거나 프로세스가 실행 중인 사용자는 삭제에 실패한다. who로 로그인 상태를, ps -u devuser로 실행 중인 프로세스를 먼저 확인한다.


8. 명령어 정리

작업 명령
현재 사용자·그룹 확인 whoami, id, groups
계정 정보 조회 getent passwd 사용자, getent group 그룹
사용자 생성 sudo adduser 사용자 또는 sudo useradd -m -s /bin/bash 사용자
비밀번호 설정·변경 sudo passwd 사용자
그룹 생성·삭제 sudo groupadd 그룹, sudo groupdel 그룹
보조 그룹에 추가 sudo usermod -aG 그룹 사용자
보조 그룹에서 제거 sudo gpasswd -d 사용자 그룹
sudo 권한 부여 sudo usermod -aG sudo 사용자
sudo 세부 설정 sudo visudo -f /etc/sudoers.d/파일명
사용자 전환 sudo su - 사용자
비밀번호 잠금·해제 sudo passwd -l 사용자, sudo passwd -u 사용자
계정 만료 sudo usermod --expiredate 1 사용자
사용자 삭제 sudo userdel -r 사용자

9. 정리

리눅스는 사용자를 UID, 그룹을 GID라는 숫자로 구분하고, 그 정보를 /etc/passwd, /etc/shadow, /etc/group 세 파일에 저장한다. adduser, usermod, userdel 같은 명령은 이 파일들을 안전하게 수정하는 도구이며, 결과는 id와 getent로 확인할 수 있다.

그룹은 여러 사용자에게 같은 권한을 주기 위한 단위다. 사용자를 그룹에 넣을 때는 기존 그룹이 지워지지 않도록 항상 usermod -aG를 쓰고, 변경은 다시 로그인해야 적용된다는 점을 기억한다. Ubuntu에서는 sudo 그룹에 넣는 것만으로 관리자 권한이 생기므로, 실제 서버에서는 visudo로 필요한 명령만 허용하는 방식을 고려한다.

계정을 막을 때는 passwd -l이 비밀번호 로그인만 막고 SSH 공개키 로그인은 막지 않는다는 점에 주의한다. 공개키로 접속하는 서버라면 usermod --expiredate로 계정을 만료시키고, 더 이상 필요 없는 계정은 파일을 백업한 뒤 userdel -r로 정리한다.