[Linux]사용자와 그룹 관리를 위한 리눅스 명령어 및 관련 파일들 총정리
Linux 사용자(user)와 그룹(group)을 관리하기 위한 명령어들과 함께 관련 파일/디렉토리에 대해 알아보겠습니다. 마지막으로 사용자를 자동 등록하고 임의로 생성한 비밀번호도 설정하는 Shell Script을 만들어 보겠습니다. Linux 서버 취약점 분석/조치법 중 “패스워드 복잡성 설정”도 참고하시기 바랍니다.
사용자 및 그룹 정보를 등록/수정/삭제하는 명령어로 root 계정으로 로그인하거나 sudo와 함께 사용
- useradd : 사용자 신규 생성
- usermod : 사용자의 쉘, 홈 디렉토리, 그룹, UID, GID 등을 변경
- userdel : 사용자 삭제
- newusers : batch로 사용자를 추가 또는 변경
- passwd : 사용자 비밀번호 변경
- pwconv : 비밀번호 관리를 /etc/shadow 파일로 전환할 때 사용
- pwunconv : /etc/shadow 파일 비활성화 명령어, 비밀번호를 /etc/passwd 파일에 평문으로 저장
- chage : 사용자 비밀번호 만료일 등을 지정
- chfn : /etc/passwd 파일의 다섯 번째 항목 값인 코멘트 항목의 값을 설정
- chsh : /etc/passwd 파일의 일곱 번째 항목 값인 Shell 항목의 값을 설정
- groupadd : 그룹 신규 생성, Redhat계열은 사용자를 생성할 때 사용자 이름과 동일한 그룹을 생성
- groupmod : 그룹의 이름 및 GID 변경
- groupdel : 그룹 삭제
- gpasswd : 그룹 비밀번호 변경
사용자 및 그룹 정보와 관련된 파일 및 디렉토리(/etc/ 디렉토리 아래 있음)
- /etc/passwd : 사용자 정보 저장
- /etc/shadow : 사용자의 암호화된 비밀번호 저장
- /etc/group : 그룹 정보 저장
- /etc/gshadow : 그룹의 암호화된 비밀번호 저장
- /etc/login.defs : 로그인 수행 시 기본 설정
- /etc/default/useradd : 사용자 추가 시 디폴트 정보 제공
- /etc/sudoers : 사용자의
sudo
명령어 사용권한을 지정하는 환경 설정 파일 - /etc/skel/ : 사용자 생성 시 디폴트로 제공되는 파일 및 디렉토리 저장
useradd [옵션] 사용자명
- 사용자 계정 추가, UID = 0~65535 까지의 범위이고 신규는 1000부터 할당된다.
-D: 사용자 생성시 기본값 확인(/etc/default/useradd 정보 출력) -u uid: uid 지정 -o: uid 중복 허용 -g gid: gid -G group1,group2: 기본그룹이외에 추가로 그룹에 속하게 할 경우에 쓴다. -N: 사용자와 동일한 이름으로 그룹을 생성하지 않는다 -b: 베이스 디렉토리 지정 -d: 홈 디렉토리 지정 -m: 지정된 홈 디렉토리가 없다면 신규 생성 -M: 홈 디렉토리를 생성하지 않는다 -s: 기본 쉘 지정 -e yyyy-dd-dd: 사용자 계정의 만료일 지정 -f 일수: 비밀번호 만료일 이후 사용자 유효기간 설정 -p: 사용자 계정의 패스워드 지정(암호화된 값으로 지정) -r: 시스템 계정 생성
usermod [옵션] 사용자명
- 사용자의 쉘, 홈 디렉토리, 그룹, UID, GID 등을 변경
-d new홈디렉토리: 홈 디렉토리 변경(--home) -u uid: 사용자 uid 변경 -o: uid 중복 허용 -l new사용자명: 지정한 new사용자명으로 변경(`groupmod -n new그룹명 그룹명` 참고) -g gid: 사용자 그룹 변경 -G gid: 지정한 그룹(gid)의 일원으로 추가(==`gpasswd -a 사용자 그룹명`) -s 쉘경로: 로그인 쉘 변경(예, /bin/sh) -L: 사용자 암호 잠금(passwd -l) -U: 사용자 암호 잠금 해제(passwd -u) -aG gid: 사용자를 부가그룹(Supplementary group)에 추가 -m: -d 옵션과 함께 사용하면 홈 디렉토리를 변경하면서 기존 파일도 이동(--move-home) -e yyyy-mm-dd: 만료일 지정
userdel [옵션] 사용자명
- 사용자 계정을 삭제
- 지정한 사용자가 생성한 모든 파일/디렉토리를 삭제하고 싶다면, `find / -user 사용자 -exec rm -rf{} \;` 실행
-r: 지정된 사용자의 홈 디렉토리와 메일 스풀도 함께 삭제 -f: 지정된 사용자가 로그인되어 있더라도 강제 삭제
newusers [옵션] 파일명
/etc/passwd 파일과 동일한 형식으로 신규 사용자 정보를 포함한 파일 생성 - UID, GID, Home Directory와 Login Shell 필드가 입력되지 않으면 Linux 설정값을 따른다
[/etc/passwd 및 /etc/group 파일 확인]
cat /etc/passwd | grep testuser
cat /etc/group | grep -P "1100|1101"
developers:x:1100:
designers:x:1101:
[사용자 등록 파일 생성]
-아래 예제 파일에 등록된 GID 1100와 1101를 가진 그룹은 이미 생성되어 있다.
vi /root/users.txt
testuser1:test1@1234:600:1100:Developer User1,testuser1@test.com:/home/tester1:/bin/bash
testuser2:test2@1234:601:1101:::/bin/bash
testuser3:test3@1234:::::/sbin/nologin
testuser4:test4@1234::::/home/tester4:/bin/tsh
newusers /root/users.txt
cat /etc/passwd | grep testuser
testuser1:x:600:1100:Developer User1,testuser1@test.com:/home/tester1:/bin/bash
testuser2:x:601:1101:::/bin/bash
testuser3:x:1004:1004:::/sbin/nologin
testuser4:x:1005:1005::/home/tester4:/bin/tsh
passwd [옵션] 사용자명
- 사용자의 비밀번호 및 비밀번호와 관련된 기간들 변경
-d: 비밀번호 삭제, 비밀번호 없이 로그인 가능 -e: 비밀번호 만료, 다음 로그인 시 비밀번호 변경(==`chage -d 0 사용자명`) -S: 지정한 사용자의 비밀번호 상태 출력 -l: 지정한 사용자의 비밀번호 Lock, unlock할 때까지 로그인 불가(==`usermod -L 사용자명`) -u: 지정한 사용자의 비밀번호 Unlock(==`usermod -U 사용자명`) -n 숫자: 지정한 기간(日) 이내에는 비밀번호 변경 불가(==`chage -m 사용자명`) -x 숫자: 지정한 기간(日) 동안 비밀번호 사용(==`chage -M 사용자명`) -w 숫자: 지정한 기간(日) 전부터 만료 前 비밀번호 변경 경고(==`chage -W 사용자명`) -i 숫자: 지정한 기간(日) 동안 비밀번호 만료 후에도 유예(==`chage -I 사용자명`, ==`usermod -f 사용자명`)
cat /etc/passwd | grep archer
archer:x:1003:1003::/home/archer:/bin/bash
passwd archer
Changing password for user archer.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
chage [옵션] 사용자명
- `passwd` 명령어와 유사한 기능을 수행하며 주로 이 명령으로 비밀번호와 관련된 기간을 지정
-l: 비밀번호 만료 정보 출력(--list) -d 숫자|날짜: 마지막 비밀번호 변경일. '-d 0' 옵션은 다음 로그인 시 비밀번호를 변경(==`passwd -e 사용자명`) -m 숫자: 변경가능 최소 기간(min day) -M 숫자: 변경가능 최대 기간(max day) -W 숫자: 만료 전 경고 메세지가 표시되는 기간(warning day) -I 숫자: 계정 만료 후 유예기간(inactive). '-I -1' 옵션을 실행하면 유예기간이 삭제됨 -E 숫자|날짜: 계정이 만료되는 날을 설정, '-E -1' 옵션을 실행하면 만료일이 삭제됨
chfn [옵션] 사용자명
- 사용자의 정보를 설정하거나 변경하는 명령어, 사용자의 실제 이름, 직장, 집, 전화번호 등의 정보를 입력하거나 변경할 수 있는 명령어
옵션없이 실행하면 대화식으로 Name [], Office [], Office Phone [], Home Phone [] 입력 -f: 실제 이름 -o: 사무실 번호 -p: 사무실 전화번호 -h: 집 전화번호
chsh [옵션] 사용자명
- 시스템이 지원하는 쉘 목록을 출력하거나 사용자별 사용하는 shell을 변경하는 명령어
- 현재 로그인한 사용자가 사용하는 쉘 확인 : `echo $SHELL` 또는 `printevn SHELL`
-l: 사용자명 지정없이 실행하면 /etc/shells 파일 내용 출력 -s shell이름: 사용자의 로그인 쉘 변경
groupadd [옵션] 그룹명
- Redhat 계열은 사용자를 생성할 때 사용자 이름과 동일한 그룹을 생성
- 사용할 경우는 많지 않으나 관리목적으로 그룹을 신규 생성
-f: 그룹을 생성할 때 이미 생성되어 있더라도 성공으로 간주 -r: 시스템 그룹 생성, /etc/login.defs 파일의 SYS_GID_MIN ~ SYS_GID_MAX 사이의 값 선택 -g gid: GID 지정 -o: GID 중복 허용
groupmod [옵션] 그룹명
- 사용자 그룹의 이름 및 GID 변경
-g gid: 지정한 GID로 변경 -o: GID 중복 허용(--non-unique) -n new그룹명: 지정한 new그룹명으로 변경(--new-name)(`usermod -l new사용자명 사용자명` 참고)
groupdel [옵션] 그룹명
- 그룹 삭제
-f: Primary 사용자 그룹이더라도 삭제
gpasswd [옵션] 그룹명
- /etc/group 파일과 /etc/gshadow 파일을 관리하는 명령어
- 옵션을 입력하지 않으면 그룹의 비밀번호를 입력/변경하는 prompt 출력
-a 사용자: 지정한 사용자를 그룹의 멤버로 추가(--add) (== `usermod -G 그룹명 사용자명`) -d 사용자: 지정한 사용자를 그룹의 멤버에서 삭제(--delete) -r: 지정한 <그룹>의 비밀번호 삭제(비밀번호 '')(--remove-password) (`passwd -d 사용자명` 참고) -A 사용자1,,사용자n: 지정한 사용자들를 그룹의 관리자로 지정(--administrators), 기존 관리자 삭제 -M 사용자1,,사용자n: 지정한 사용자들를 그룹 멤버로 설정(--members), 기존 멤버 삭제 -R: 그룹에의 접근을 제한(비밀번호 '!')(--restrict) (`passwd -l 사용자명` 참고) 암호를 가진 그룹 멤버들만이 `newgrp` 명령어를 통해서만 지정한 그룹으로 join 가능
/etc/passwd 파일
pwck
명령어를 사용하여 잘못된 내용이 있는지 점검vipw
명령어로 /etc/passwd 파일 편집
[필드설명] user:password:uid:gid:GECOS_Field:/path/to/home_directory:/bin/loginshell #1 : 사용자명 #2 : 패스워드("x"가 표시되어 있으면 /etc/shadow파일에 저장되어 있다, shadow password 사용) #3 : 사용자 계정 uid #4 : 사용자 계정 gid #5 : 사용자 설명(GECOS필드) #6 : 사용자 계정 홈 디렉토리 #7 : 사용자 계정 로그인 쉘(사용자의 로그인 제한을 위해서는 셀 설정을 /sbin/nologin으로 변경)
/etc/shadow 파일
- 사용자의 암호화된 비밀번호 저장
passwd
명령어나chage
명령어로 변경[필드설명] #1 : 사용자명 #2 : 패스워드, $6$는 패스워드를 암호화하기 위해 사용한 해시 알고리즘을 의미($6$ = SHA-512) /etc/login.defs 파일의 "ENCRYPT_METHOD SHA512" "*" - 패스워드가 잠긴 상태로 패스워드 로그인은 불가하지만, 별도의 인증 방식을 사용하여(예, ssh 인증키) 로그인 가능 "!!" - 패스워드가 잠긴 상태로 모든 로그인이 불가능하다. 사용자 생성 후 패스워드를 설정하지 않는 상태. 빈값 - 패스워드를 설정하지 않은 상태로 패스워드 없이 로그인이 가능 #3 : 마지막 변경일(1970년1월1일 이후 계산한 값) $4 : 최소 변경기간 #5 : 최대 변경기간 #6 : 만료 경고기간 #7 : 유예기간(패스워드 만료후 계정 비활성 기간) #8 : 만료일(1970년1월1일 이후 계산한 값) #9 : 예약 필드
/etc/group 파일
grpck
명령어를 사용하여 잘못된 내용이 있는지 점검vigr
명령어로 /etc/group 파일 편집
[필드설명] #1: 그룹명 #2: 그룹 비밀번호("x"로 표시되어 있으면 /etc/gshadow 파일에 비밀번호 저장) #3: GID $4: 부가그룹 멤버 목록(/etc/passwd 파일에 있는 #4 GID는 주 그룹을 의미)
/etc/gshadow 파일
- 그룹의 암호화된 비밀번호 저장
- `grpck` 명령어를 사용하여 그룹 비밀번호 점검
[필드설명] #1: 그룹명 #2: 암호화된 그룹 비밀번호 #3: 그룹 관리자(gpasswd -A 명령어 참고) #4: 멤버 목록(gpasswd -a, usermod -aG 명령어 참고)
/etc/login.defs 파일
- 패스워드 변경주기, 홈 디렉토리 생성여부, UID 및 GID의 범위, umask, 디폴트 암호화 해시 알고리즘 등을 저장
[주요 지시자] MAIL_DIR /var/spool/mail PASS_MAX_DAYS 99999 PASS_MIN_DAYS 0 PASS_MIN_LEN 5 PASS_WARN_AGE 7 CREATE_HOME yes UMASK 022 ENCRYPT_METHOD SHA512
/etc/default/useradd 파일
- useradd 명령어로 신규 사용자 생성할 때 사용하는 디폴트 값 지정
useradd -D
명령어로 내용 출력
vi /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
/etc/default/sudoers 파일
visudo
명령어로 편집
지정형식: hostname=(runas-user:runas-group) [NOPASSWORD:]commands #root 사용자는 모든 호스트에서 모든 사용자의 모든 명령어를 실행 root ALL=(ALL) ALL #wheel사용자 그룹에 속한 사용자는 모든 호스트에서 모든 사용자의 모든 명령어를 "비밀번호 없이" 실행 %wheel ALL=(ALL) NOPASSWD: ALL #users 사용자 그룹에 속한 사용자는 /mnt/cdrom 디렉터리에 마운트와 언마운트 가능 %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom #users 사용자 그룹에 속한 사용자는 로컬호스트에서 시스템 중지 가능 %users localhost=/sbin/shutdown -h now
/etc/skel/ 디렉토리
- useradd 명령으로 신규 사용자 등록 시 디폴트로 제공하는 파일 및 디렉토리가 저장되어 있으며 사용자의 홈 디렉토리에 복사된다
ls -al /etc/skel/
total 24
drwxr-xr-x. 3 root root 78 Jun 1 09:09 .
drwxr-xr-x. 142 root root 8192 Jun 1 23:20 ..
-rw-r--r--. 1 root root 18 Apr 8 2022 .bash_logout
-rw-r--r--. 1 root root 141 Apr 8 2022 .bash_profile
-rw-r--r--. 1 root root 376 Apr 8 2022 .bashrc
drwxr-xr-x. 4 root root 39 Jun 1 09:08 .mozilla
Shell Script를 이용한 사용자 등록
vi createUser.sh
#!/bin/bash
set -e
NEWUSR=$1
#PASSWD=$(date | md5sum | cut -c1-8)
PASSWD=$(tr -dc A-Za-z0-9_ < /dev/urandom | head -c8 | xargs)
echo "The password of user '${NEWUSR}' : $PASSWD"
useradd -m -U $NEWUSR
#echo -e "$PASSWD\n$PASSWD" | passwd $NEWUSR
echo "$PASSWD" | passwd --stdin $NEWUSR
passwd -n 7 -x 30 -w 7 $NEWUSR
chmod 755 ./createUser.sh
./createUser.sh testuser
The temporary password of user 'testuser' : YsCOd1vV
Changing password for user testuser.
passwd: all authentication tokens updated successfully.
Adjusting aging data for user testuser.
passwd: Success
cat /etc/passwd | grep testuser
testuser:x:1001:1001::/home/testuser:/bin/bash
함께 읽어보면 좋은 Contents
- Linux서버 취약점 분석/조치법 > 패스워드 복잡성 설정
- [Linux]비밀번호의 암호화 알고리즘 및 솔트(salt)에 관하여
- [Linux]사용자 정보 변경 명령어들의 필수 옵션 추가 정리
- [Linux]권한 및 소유권 관리를 위한 리눅스 명령어들
- [Linux]사용자와 그룹 관리를 위한 리눅스 명령어 및 관련 파일들 총정리