리눅스 useradd 명령어 사용법 - 계정 생성 옵션과 서비스 계정
이 명령어를 언제 쓰는가
새 팀원에게 서버 계정을 만들어 주거나, 애플리케이션을 root가 아닌 전용 계정으로 돌리기 위해 서비스 계정을 만들 때 쓴다. 배포 자동화 계정(deploy), 데몬 실행 계정(myapp)을 만드는 것이 실무에서 가장 잦은 용도다.
useradd는 저수준 명령이라 옵션을 주지 않으면 홈 디렉터리도, 로그인 셸도 기대와 다르게 만들어진다. 어떤 옵션이 필수인지 알고 써야 한다.
기본 형식
sudo useradd [옵션] 계정명
- root 권한이 필요하다.
- 실행하면
/etc/passwd,/etc/shadow,/etc/group에 항목이 추가된다. - 비밀번호는 설정되지 않는다. 만든 직후 계정은 잠긴 상태이므로
passwd를 따로 실행하거나 SSH 키를 넣어야 한다.
Ubuntu/Debian에는 대화형 래퍼인 adduser가 따로 있다. 사람이 손으로 계정을 만들 때는 adduser가 편하고, 스크립트에서는 동작이 일정한 useradd를 쓴다. RHEL/CentOS 계열에서 adduser는 useradd의 심볼릭 링크일 뿐이라 대화형이 아니다.
자주 쓰는 옵션
| 옵션 | 의미 | 예시 |
|---|---|---|
-m | 홈 디렉터리 생성(Ubuntu/Debian에서는 사실상 필수) | useradd -m jihoon |
-s 셸 | 로그인 셸 지정 | useradd -m -s /bin/bash jihoon |
-G 그룹,그룹 | 보조 그룹에 추가 | useradd -m -G sudo,docker jihoon |
-g 그룹 | 기본(주) 그룹 지정 | useradd -g devteam jihoon |
-r | 시스템 계정으로 생성(UID를 1000 미만에서 할당, 홈 미생성) | useradd -r myapp |
-d 경로 | 홈 디렉터리 경로 지정 | useradd -m -d /srv/deploy deploy |
-u UID | UID 직접 지정(서버 간 UID를 맞출 때) | useradd -u 1500 -m deploy |
-c "설명" | 계정 설명(이름·용도) 기록 | useradd -c "Deploy bot" -r deploy |
-e YYYY-MM-DD | 계정 만료일 지정(외주·임시 계정) | useradd -m -e 2026-12-31 temp1 |
실전 예제
1. 사람이 쓸 일반 계정을 만들고 sudo 권한을 준다. 그룹 이름은 배포판마다 다르다.
# Ubuntu/Debian
sudo useradd -m -s /bin/bash -G sudo jihoon
sudo passwd jihoon
# RHEL/CentOS/Rocky
sudo useradd -m -s /bin/bash -G wheel jihoon
sudo passwd jihoon
2. 애플리케이션 전용 서비스 계정을 만든다. 로그인이 필요 없으므로 셸을 막는다.
sudo useradd -r -s /usr/sbin/nologin -d /srv/myapp -M myapp
sudo mkdir -p /srv/myapp
sudo chown -R myapp:myapp /srv/myapp
nologin 경로도 다르다. Ubuntu/Debian은 /usr/sbin/nologin, RHEL 계열은 /sbin/nologin이다.
3. 비밀번호 없이 SSH 키로만 접속하는 배포 계정을 만든다. 실무에서 CI/CD 계정을 만드는 표준 형태다.
sudo useradd -m -s /bin/bash deploy
sudo mkdir -p /home/deploy/.ssh
sudo tee /home/deploy/.ssh/authorized_keys < ~/deploy_key.pub > /dev/null
sudo chown -R deploy:deploy /home/deploy/.ssh
sudo chmod 700 /home/deploy/.ssh
sudo chmod 600 /home/deploy/.ssh/authorized_keys
4. 만들어진 결과를 확인한다. 계정을 만든 뒤에는 항상 id로 검증한다.
$ id jihoon
uid=1001(jihoon) gid=1001(jihoon) groups=1001(jihoon),27(sudo)
$ grep '^jihoon' /etc/passwd
jihoon:x:1001:1001::/home/jihoon:/bin/bash
5. 이미 만든 계정을 나중에 그룹에 추가한다. 여기서 -a를 빼면 안 된다.
sudo usermod -aG docker jihoon
함정과 주의점
usermod -G에서-a를 빼면 기존 보조 그룹이 전부 날아간다.sudo usermod -G docker jihoon은 jihoon을 docker 그룹에만 남기고 sudo 그룹에서 빼버린다. 서버 관리자를 sudo에서 제외시켜 자기 손을 자르는 사고가 실제로 자주 난다. 추가할 때는 항상-aG다.-m없이 만든 계정은 홈 디렉터리가 없다. Ubuntu/Debian의 useradd는 홈을 만들지 않으므로, 로그인하면/에 떨어지고.bashrc도 없어 프롬프트가$만 나온다. RHEL 계열은/etc/login.defs의CREATE_HOME설정에 따라 기본으로 만들어져서 동작이 다르다. 배포판을 오가며 스크립트를 쓴다면 항상-m을 명시한다.- 계정을 만들고 비밀번호를 설정하지 않으면 로그인이 안 된다.
/etc/shadow의 비밀번호 자리가!로 잠긴 상태다. 이 자체는 안전한 기본값이지만, 계정을 만들어 놓고 "왜 로그인이 안 되냐"는 문의로 이어진다. 비밀번호를 주거나 SSH 키를 넣어야 쓸 수 있다. - 서비스 계정에 로그인 셸을 주지 않는다.
-s /bin/bash로 만든 데몬 계정은 침해 시 그대로 셸을 내준다. 서비스 계정은nologin으로 만들고, 사람이 그 계정으로 작업해야 하면sudo -u myapp을 쓴다. - 계정 삭제 시 홈 디렉터리 처리에 주의한다.
userdel jihoon은 홈을 남기고,userdel -r jihoon은 홈과 메일 스풀까지 지운다. 지우기 전에find / -user jihoon으로 그 계정 소유 파일이 서비스 경로에 남아 있지 않은지 확인한다.
함께 보면 좋은 명령어
passwd— 계정을 만든 다음 비밀번호를 설정하거나 잠근다.usermod— 셸·그룹·홈 등 기존 계정의 속성을 바꾼다.id— 만들어진 UID·GID·그룹을 확인하는 검증 도구.userdel— 계정을 삭제한다.-r여부를 반드시 의식한다.