Ubuntu 사용자 관리
사용자 계정 관련 파일
/etc/passwd
- 사용자 계정 정보가 저장된 기본 파일
- 초창기에는 암호도 저장되었지만 지금은 암호는 /etc/shadow 파일에 저장
- 구조
- 7개의 항목으로 구성, 콜론으로 구분
- 로그인ID:x:UID:GID:설명:홈디렉터리:로그인쉘
- x는 예전에 비밀번호 저장하던 영역인데 호환성 문제 때문에 남아있음
- UID는 사용자를 구분하기 위한 번호로 일반적으로 0~9999 번과 65534는 시스템 사용자를 위한 UID로 예약되어 있고 일반 사용자는 1000번 부터 할당
- UID가 똑같은 계정은 같은 /home 디렉터리에서 작업
- root가 0번, 시스템 데몬이 1, 명령어를 위한 관리 계정이 2
- GID는 사용자가 속한 그룹의 ID로 사용자를 등록할 때 정해지고 특별히 소속 그룹을 지정하지 않는 경우 로그인 ID가 그룹으로 등록
- 그룹에 대한 정보는 /etc/group 에 저장
- 설명은 사용자의 실제 이름이나 부서명 같은 것을 적을 수 있는 부분
- 홈디렉터리: 로그인을 했을 때 자동으로 로그인 되는 디렉터리의 절대 경로
- 로그인 쉘은 로그인했을 때 처음 보여지는 쉘
- 로그인 쉘
/etc/shadow
- 사용자 암호에 대한 정보를 저장하는 파일
- 9개 영역으로 구성 -> ID:비밀번호:비밀번호 변경날짜:비밀번호 변경하고 사용해야 하는 최소 날짜:비밀번호 변경하고 사용해야 하는 최대 날짜:경고 발생할 날짜:비밀번호가 유효한 마지막 날짜:미래를 위해서 만든 항목
- 비밀번호 영역은 단방향 암호화를 이용해서 저장, 시스템계정은 *
- 단방향 암호화: 암호화한 내용과 평문 비교해서 일치 여부는 알 수 있지만 복원은 안됨
- 양방향 암호화: 암호화한 내용을 기반으로 원래 내용을 만들 수 있는 방식
- 비밀번호 변경 날짜: 1970/1/1 을 기준으로 지나온 날짜
dh@dh:~$ sudo cat /etc/shadow | grep user3
[sudo] password for dh:
user3:$y$j9T$TDKiiNpxhl096xX71cg0W1$k1dnZsYuMuXn4mchUNSqZtRl6f7OCi1NztcQExFQqIC:19975:0:99999:7::20088:
/etc/login.defs
- 로그인과 기본 설정 파일
- 주요 설정 값
- MAIL_DIR -> /var/mail : 기본 메일 디렉터리
- PASS_MAX_DAYS -> 99999
- PASS_MIN_DAYS -> 0
- PASS_WARN_AGE -> 7
- UID_MIN, UID_MAX -> 1000~60000: 사용자 계정의 UID 범위
- SYS_UID_MIN, SYS_UID_MAX -> 100~699: 사용자 계정의 UID 범위
- GID_MIN, GID_MAX -> 1000~60000: 사용자 계정의 GID 범위
- SYS_GID_MIN, SYS_GID_MAX -> 100~699: 사용자 계정의 GID 범위
- DEFAULT_HOME -> yes: 사용자 홈 디렉터리 생성 여부
- UMASK -> 0002: umask 값 설정
- USERGROUP_ENAB: yes: 계정 삭제 시 그룹 삭제 여부
- ENCRYPT_METHOD -> SHA512: 암호화 기법
/etc/group
- 그룹의 정보가 저장된 파일
- 리눅스에서 사용자는 하나 이상의 그룹에 속해야 함
- 기본 그룹은 /etc/passwd에 작성되어 있고 2차 그룹에 대한 내용을 /etc/group에 작성
- 그룹이름:x:GID:그룹멤버
/etc/gshadow
- 그룹 암호가 저장된 파일
- 유닉스에는 없는 파일
계정 관리 명령
사용자 계정 생성
- 형식
useradd [옵션] [로그인ID]
- 옵션
u: UID 지정 o: UID 중복 허용 g: GID 지정 G: 2차 그룹 지정 d: 홈 디렉터리 지정 s: 기본 쉘 c: 부가적인 설명 D: 기본값을 설정하거나 출력 e: EXPIRE 항목을 설정 f: 비활성 설정 k: 계정 생성할 때 사용할 초기화 파일을 저장한 디렉터리 설정
- 사용자 계정 시 설정된 옵션은 vi를 이용해서 /etc/default/user 파일을 수정해서 변경할 수 있지만 되도록이면 -b, -e, -f -g, -s 와 같은 옵션을 이용해서 수정하는 것을 권장
- 옵션을 이용한 사용자 계정 설정
dh@dh:~$ sudo useradd -s /bin/bash -m -d /home/user2 -u 2000 -g 1000 -G 3 user2
[sudo] password for dh:
dh@dh:~$ grep user2 /etc/passwd
user2:x:2000:1000::/home/user2:/bin/bash
- 사용자 계정을 생성할 때는
sudo passwd 새유저
명령을 이용해서 비밀번호를 설정을 해야함 - 사용자 계정이 만들어질 때의 옵션 확인:
useradd -D
- EXPIRE 변경:
sudo useradd -D -e 2024-12-31
dh@dh:~$ useradd -D
GROUP=100 # 그룹 ID
HOME=/home # 홈 디렉터리 생성 위치
INACTIVE=-1 # 0으로 설정하면 암호가 만료되자 마자 바로 계정이 잠김, -1: 1의 2의 보수 (1111, 음수가 없을 때 가장 큰 수 의미)
EXPIRE= # 계정 종료일
SHELL=/bin/bash # 기본 로그인 쉘을 설정
SKEL=/etc/skel # 홈 디렉터리에 복사할 기본 환경 파일의 경로
CREATE_MAIL_SPOOL=no # 메일 디렉터리 생성 여부
LOG_INIT=yes # 로그
/etc/skel 디렉터리
dh@dh:~$ ls -al /etc/skel
total 28
drwxr-xr-x 2 root root 4096 Aug 28 00:37 .
drwxr-xr-x 139 root root 12288 Sep 9 12:33 ..
-rw-r--r-- 1 root root 220 Mar 31 17:41 .bash_logout
-rw-r--r-- 1 root root 3771 Mar 31 17:41 .bashrc
-rw-r--r-- 1 root root 807 Mar 31 17:41 .profile
- adduser 명령
- 사용자계정을 생성하는 명령
- 형식
adduser [옵션] 로그인ID 옵션 --uid --gid --home --shell: --gecos: 설명을 붙여주는 옵션
- 생성할 때 옵션 적용 내용이 출력됨
dh@dh:~$ sudo adduser user3
info: Adding user `user3' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `user3' (1002) ...
info: Adding new user `user3' (1002) with group `user3 (1002)' ...
info: Creating home directory `/home/user3' ...
info: Copying files from `/etc/skel' ...
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: password updated successfully
Changing the user information for user3
Enter the new value, or press ENTER for the default
Full Name []: userdh
Room Number []: none
Work Phone []: none
Home Phone []: none
Other []: none
Is the information correct? [Y/n] y
info: Adding new user `user3' to supplemental / extra groups `users' ...
info: Adding user `user3' to group `users' ...
- 생성한 유저 확인
dh@dh:~$ tail -3 /etc/passwd
newdh:x:1001:1001::/home/newdh:/bin/sh
user2:x:2000:1000::/home/user2:/bin/bash
user3:x:1002:1002:userdh,none,none,none,none:/home/user3:/bin/bash
dh@dh:~$ cat /etc/passwd | grep user3
user3:x:1002:1002:userdh,none,none,none,none:/home/user3:/bin/bash
- adduser로 유저를 생성할 때는 /etc/adduser.conf 파일을 기반으로 함, useradd와 달리 bash shell 사용
계정 수정
- 명령 형식
usermod [옵션] [로그인ID]
- 옵션
u: UID 수정 o: UID 중복 허용 g: 기본 그룹 수정 G: 2차 그룹 수정 d: 홈 디렉터리 수정 s: 기본 쉘 수정 c: 보충 설명 수정 f: 계정 비활성화 날짜를 수정 e: 계정 만료날짜 수정 i: 계정 이름 변경
- UID를 수정해서 중복을 허용하게 되면 사용자ID가 달라도 동일한 계정으로 로그인 한 것으로 간주
패스워드 에이징
- aging - 시간이 지남에 따라 기다린 시간 만큼 우선순위가 높아지는 것 ( 작업시간 + 대기시간 / 대기시간)
- 패스워드 에이징: 비밀번호의 유효 기간을 설정하는 것
- 관련 명령
useradd, usermod, passwd 명령 수정 change 명령으로 수정
- MIN passwd -n 날짜 change -m
- MAX passwd -x 날짜 change -M
- WARNING passwd -w 날짜 change -W
- INACTIVE useradd -f 날수, usermod -f 날수 change -I
- EXPIRE useradd -e 날짜, usermod -e 날짜 change -E
dh@dh:~$ sudo usermod -u 3003 user2
[sudo] password for dh:
dh@dh:~$ cat /etc/passwd | grep user2
user2:x:3003:1000::/home/user2:/bin/bash
계정 변경
- 기존의 값을 확인
sudo cat /etc/shadow | grep user3
- 변경:
sudo usermod -f 10 -e 2024-12-31 user3
dh@dh:~$ sudo cat /etc/shadow | grep user3
user3:$y$j9T$TDKiiNpxhl096xX71cg0W1$k1dnZsYuMuXn4mchUNSqZtRl6f7OCi1NztcQExFQqIC:19975:0:99999:7:10:20088:
계정 삭제
- 형식
userdel [옵션] [로그인ID]
- 옵션
r: 홈 디렉터리까지 삭제 f: 로그인 중이어도 강제 삭제
사용자 계정 명령 실습
- useradd 명령으로 test01, test02 계정을 생성: 비밀번호 설정 없이 계정을 생성(원격 접속 불가)하고 계정이 생성될 때 수행하는 기본 작업을 보여주지 않음
로그인ID 로그인쉘 UID 2차그룹 성명
test01 sh(본 쉘) 2100 3 test01.user
test02 bash 2200 4 test02.user
=>
sudo useradd -m -u 2100 -G 3 -s /bin/sh -c "test01 user" test01
sudo useradd -m -u 2200 -G 4 -s /bin/bash -c "test02 user" test02
- adduser 명령으로 test03 계정을 생성: 초기 설정 과정이 화면에 출력되고 비밀번호 설정 메시지가 제공됨
로그인ID 로그인쉘 UID 성명
test03 sh(본 쉘) 2300 test03.user
=>
sudo adduser --uid 2300 --shell /bin/bash --gecos "test03 user" test03
- 패스워드 에이징(유효 기간 수정)
- chage 명령으로 수행
- 항목 MIN(m) MAX(M) WARNING(W) INACTIVE(I) EXPIRE(E)
4 200 10 5 2024-12-09
dh@dh:~$ sudo chage -m 4 -M 200 -W 10 -I 5 -E 2024-12-09 test01
dh@dh:~$ sudo cat /etc/shadow | grep test01
test01:!:19975:4:200:10:5:20066:
- test03 계정의 UID를 2010으로 계정의 이름을 test33으로 수정
- usermod 명령을 이용
- uid를 u 옵션을 이용
- 계정의 이름 변경은 l 옵션 사용
dh@dh:~$ sudo usermod -u 2010 -l test33 test03
dh@dh:~$ sudo cat /etc/passwd | grep test03
test33:x:2010:1001:,,,:/home/test03:/bin/bash
- test02 계정을 삭제 - 사용자의 홈 디렉터리까지 삭제
sudo userdel -r test02
- public cloud에서 IaaS로 머신을 제공할 때 계정을 추가할 수 있도록 하는데 이 경우 계정만 추가하도록 해주는 경우도 있고 /home 디렉터리를 만들어주는 경우도 있음, /home 디렉터리가 필요없는 경우 UID만 같게 하면 같은 /home 디렉터리에서 작업 가능
그룹 관리 명령
- 리눅스는 모든 유저가 하나 이상의 그룹에 속하도록 함
- 시스템을 사용하는 사용자가 많아지면 업무나 기능에 따라 사용자들을 적절히 나누고 권한을 조정해야 함
- 관련 명령은
groupadd, addgroup, groupmod, groupdel
그룹 생성
- groupadd
groupadd [옵션] [그룹이름]
- 옵션
g: 그룹아이디
o: 그룹아이디 중복 허용
- 옵션 없이 생성하면 마지막에 생성된 그룹 아이디 다음 번호로 그룹 아이디를 설정해서 생성
- 옵션 없이 그룹 생성
sudo groupadd gtest01
- 그룹 아이디를 직접 설정
sudo groupadd -g 3000 gtest02
dh@dh:~$ sudo groupadd -g 3000 gtest02
[sudo] password for dh:
dh@dh:~$ sudo cat /etc/group | grep gtest02
gtest02:x:3000:
dh@dh:~$ sudo groupadd -o -g 3000 gtest03
dh@dh:~$ sudo tail /etc/group
nm-openvpn:x:122:
lxd:x:123:
gamemode:x:986:
gnome-initial-setup:x:985:
dh:x:1000:
plocate:x:124:
test01:x:2100:
test03:x:1001:
gtest02:x:3000:
gtest03:x:3000:
- addgroup 명령으로 생성 가능한데 이 때는 옵션이 –gid
sudo addgroup --gid 3001 gtest04
그룹수정
- groupmod [옵션] [그룹아이디]
- -g 옵션을 이용해 그룹 아이디를 변경하는 것이 가능
- -n 옵션을 이용해 그룹 이름을 변경하는 것이 가능
sudo groupmod -g 2500 -n gtest05 gtest04
그룹삭제
- groupdel
sudo groupdel gtest05
그룹 암호 설정 및 사용
gpasswd [옵션] [그룹이름]
옵션
a: 사용자 계정을 그룹에 추가 d: 사용자 계정을 그룹에서 삭제 r: 그룹 암호를 삭제 옵션이 없으면 암호 설정
그룹에 멤버 추가
sudo gpasswd -a test01 gtest02
그룹에서 멤버 삭제
sudo gpasswd -d test01 gtest02
그룹 암호 설정
sudo gpasswd gtest02
암호를 설정하는 이유는 한 명의 유저가 서로 다른 2개 이상의 그룹에 소속된 경우 그룹을 변경하고자 할 때 사용 이 때 사용하는 명령은
newgrp [그룹이름]
사용자 정보 관리 명령
UID와 EUID
- UID(RUID): 사용자가 로그인 할 때 사용한 계정의 UID
- EUID: 현재 명령을 수행하는 주체의 UID
- 대부분의 경우는 UID와 EUID가 일치하지만 달라지는 경우
- 실행 파일에 setuid가 설정된 경우
- su 명령을 이용해서 계정을 변경한 경우
who와 w
who
: 현재 로그인한 사용자 정보를 출력- 옵션을 설정하면 일부 정보만 확인 가능
w
명령은 현재 시스템에 로그인 한 사용자의 정보 외에 사용자가 현재 실행 중인 작업에 대한 정보를 출력- 옵션에 사용자 이름을 설정하면 사용자 이름에 해당하는 작업만 출력
last
명령을 이용하면 시스템에 로그인하고 로그아웃 정보를 출력
UID와 EUID 확인
- 현재 사용 중인 유저 확인(EUID 출력):
whoami
- 로그인한 유저 확인(RUID 또는 UID 출력):
who am i
- 아이디 확인:
id
- 소속 그룹 확인:
groups [유저아이디]
- 유저아이디를 생략하면 현재 사용자 계정이 속한 그룹
권한 수정
다른 계정으로 전환해서 권한을 사용
- 대표적인 su 명령으로 root 계정으로 전환해서 기능 사용
- root 계정으로 전환해서 권한을 사용하는 것은 위험한데 이는 시스템 관리 권한을 갖기 때문
계정 별로 특정한 작업을 수행할 수 있도록 권한을 부여
- sudo 명령으로 root 권한을 실행하려면 특정 권한을 부여받아야 하는데 이 권한은 /etc/sudoers 파일에 설정
- 사용자계정 호스트=명령어 형태로 설정
- sudoers 파일은 기본적으로 읽기 전용이므로 수정을 하고자 하면
sudo chmod
명령으로 w 권한을 설정하고 해야 함
root ALL=(ALL) ALL
- user2에게 유저를 생성하고 유저를 수정하는 권한을 갖도록 수정
user2 ALL=/usr/sbin/useradd, /usr/sbin/usermod
- ex
dh@dh:~$ sudo chmod 640 /etc/sudoers dh@dh:~$ sudo vi /etc/sudoers user2 ALL=/usr/sbin/useradd, /usr/sbin/usermod dh@dh:~$ su - user2 dh@dh:~$ sudo useradd john => john 추가 가능
- 처음 로그인 한 유저가 관리자 명령 실행 권한이 없어서 명령을 수행 못하는 경우 위처럼 sudoers 파일을 수정해서 해도 되고 su 를 이용해서 관리자로 로그인 하고
usermod -aG sudo 계정
으로 계정에 모든 관리자 명령을 수행할 수 있도록 수정하기도 함
파일 및 디렉터리 소유자와 소유 그룹 변경
- 파일이나 디렉터리를 생성하면 생성한 사용자의 계정과 그룹이 소유자와 소유 그룹으로 설정됨
- 파일이나 디렉터리의 소유자를 변경할 필요가 있을 때 사용하는 명령
- 파일 소유자를 변경하는
chown
- 파일의 소유 그룹을 변경하는
chgrp
- 형식
chown [옵션] [사용자계정] [파일이나 디렉터리 경로]
- 옵션은 R이 있는데 이 옵션은 서브 디렉터리까지 적용
- 예시
chown user2 file1 # file1의 소유자를 user2로 변경
chonw user2:grp01 file1 # file1의 소유자를 grp01의 user2로 변경
chown -R user2 file1 # file1의 소유자를 user2로 변경하는데 하위 디렉터리가 있으면 같이 변경
- 소유자 변경보다는 권한 변경을 하는 경우가 많음
실습: 홈 디렉터리에 linux_ex 디렉터리를 생성
- linux_ex 디렉터리 안에 autoever 라는 디렉터리를 생성 => mkdir -p ~/linux_ex/autoever/temp(웹 서버 만들어서 파일 업로드 기능을 만드는 경우나 Datalake를 구성하는 경우
날짜를 가지고 디렉터리를 만들어 데이터를 보관하는 경우가 있는데 이 경우 디렉터리 생성할 때 날짜를 계층별로 이용해서 디렉터리 생성)
- autoever 디렉터리안에 temp라는 디렉터리를 생성
- temp 디렉터리 안에 /etc/hosts 디렉터리의 모든 내용을 복사 => cp /etc/hosts ~/linux_ex/autoever/temp
- temp 디렉터리 안에 /etc/services 디렉터리의 모든 내용을 복사 => cp /etc/services ~/linux_ex/autoever/temp
- 소유자와 그룹 확인(소유자와 그룹이 파일을 복사할 때 로그인 중인 유저가 됨): ls -l
- hosts 파일의 소유자를 owner1으로 수정 => sudo chown owner1 hosts
- services 파일의 소유자를 owner1으로 소유 그룹도 owner1으로 변경 => sudo chown owner1:owner1 services
- 파일의 소유 그룹을 변경하는
chgrp
- 형식
chgrp [옵션] [사용자계정] [파일이나 디렉터리경로]
- 스크립트를 이용해서 자동화하는 경우 권한 문제가 발생할 수 있음
- chown 명령을 사용하는 스크립트의 경우는 앞에 sudo를 추가해서 필요한 권한을 전부 취득하고 하는 것이 좋음
- 디렉터리 관련 작업을 할 때 -R 옵션을 추가하면 하위 디렉터리까지 같이 작업을 수행하게 되는데 필터링을 수행한 후 할 수 있다면 find 명령 같은 필터링 명령을 수행하고 하는 것이 바람직, 성능 이슈가 발생할 수 있기 때문