Devin.KR
로그인

리눅스 useradd 명령어 사용법 - 계정 생성 옵션과 서비스 계정

개발자 조회 4

이 명령어를 언제 쓰는가

새 팀원에게 서버 계정을 만들어 주거나, 애플리케이션을 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 UIDUID 직접 지정(서버 간 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.defsCREATE_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 여부를 반드시 의식한다.