참고링크
리눅스(Ubuntu)에는 기본적으로 계정이 존재합니다.
리눅스에서는 사용자를 root(관리자)와 일반 사용자로 구분합니다.
각 계정은 ID가 아닌 번호를 부여하여 UID(User Identity)로 관리됩니다.
Tip.
UID가 0번인 사용자는 슈퍼유저로 인식해서 관리자 계정이 됩니다.
일반 사용자 계정의 UID 범위는 /etc/login.defs 에 정의되어 있습니다.
UID값이 0인 관리자계정 모든 권한을 가진 계정입니다.
관리자 계정을 통해 다른 계정을 생성하거나 권한을 부여하고 비밀번호를 바꿀 수 있습니다.
만약 다른 계정에 UID값을 0으로 변경하면 그 계정또한 관리자와 마찬가지로 모든 권한을 얻습니다.
일반 사용자는 관리자에게 권한을 부여받아 사용합니다.
리눅스 파일 생성 시 소유주의 권한을 가지는데 만약 일반 유저라면 root 권한을 가진 파일을 실행하거나 볼 수 없습니다.
따라서 root가 권한을 부여해야만 일반 사용자는 접근이 가능합니다.
root와 일반 사용자를 제외한 계정으로,
필요에 의해 자동 생성되며 일반적으로 로그인이 불가능합니다.
# 현재 사용자의 UID, GID, 그룹정보를 확인하는 명령어 $ id
macarong@ubuntu-server-22:~$ id uid=1000(macarong) gid=1000(macarong) groups=1000(macarong),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd)
/etc/passwd
에서 확인 가능/etc/passwd
와 /etc/group
에서 확인 가능# 현재 호스트에 로그인되어 있는 모든 사용자 출력 $ users macarong # 모든 사용자 정보 자세히 출력 (터미널 종류, 로그인 시각 등 기본적으로 출력) $ who [options] macarong tty2 2022-11-23 01:18 (tty2) # 현재 로그인한 사용자의 사용자명 출력 $ whoami macarong $id -un macarong $logname macarong # 현재 로그인한 사용자가 어떤 시스템에서 로그인했는지 어떤 프로세스를 실행하고 있는지 출력 # -h, --no-header 컬럼의 헤더를 출력하지 않음 # -s, --short 정보를 간략히 출력 $ w [options][user] 02:39:39 up 1:21, 1 user, load average: 0.00, 0.07, 0.16 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT macarong tty2 tty2 01:18 1:21m 0.01s 0.01s /usr/libexec/gnome-session-binary --session=ubuntu # 프로세스를 종료하지 않고 계정만 로그아웃하여 이전에 사용중인 계정으로 돌아가는 명령어 $ logout $ exit
# 전체 목록 확인 $ cat /etc/passwd # 아이디만 잘라서 확인 $ cut -f1 -d: /etc/passwd
# 패스워드 입력 후 로그인 sudo passwd root
# 현재 계정에서 root권한을 이용하여 명령어를 실행할 때 사용하는 명령어 # sudo뜻 : superuser do $ sudo # 로그아웃을 하지 않고 다른 사용자의 계정으로 전환 (계정명 미입력하면 root로 로그인) # su뜻 : switch user $ su [계정명]
#ssh 서비스의 root 로그인 막기 # sshd_config 파일을 root 권한으로 수정 $ sudo vi /etc/ssh/sshd_config # ... 파일내용 중 PermitRootLogin 항목을 no로 설정 # sshd 서비스 재시작 $ sudo systemctl restart sshd
시스템과 일반 사용자 사이에는 실질적인 기술적 가치가 없다. 일반적으로 OS 및 새 패키지를 설치할 때 시스템 사용자가 자동 생성된다.
-r(--system)
옵션을 사용하여 시스템 사용자 계정을 만들 수 있다.
시스템 사용자는 만료 날짜 없이 생성된다.
해당 UID는 login.defs 파일에 지정된 시스템 사용자 ID 범위에서 선택되며, 일반 사용자에게 사용되는 범위와는 다르다.
$ sudo useradd -r username
< 'useradd'와 'adduser' 의 차이 >
리눅스 CentOS에서는 adduser가 useradd에 대한 링크파일이다.
즉, CentOS에서'useradd == adduser'
이다.
반면,
Ubuntu
에서는 차이가 나뉘는데
- useradd : 순수하게 "계정만 생성하고 기본 쉘인 sh가 할당"
홈 디렉토리
나비밀번호
등은 따로 설정해주어야한다.- adduser : 계정 생서 시 비밀번호와 사용자의 기타 정보를 입력 받는다. 옵션을 통해 기본 쉘이거나 로그인 옵션 등도 설정할 수 있다. 홈 디렉토리도 자동 생성
`adduser`사용을 권장합니다.
# 사용자를 생성합니다. $ useradd testuser
추가된 사용자는 /etc/passwd 파일에서 확인할 수 있습니다.
# root계정으로 로그인 $ su # root 비밀번호 입력 $ users macarong $ useradd testuser $ cat /etc/passwd
testuser 계정이 추가되었습니다.
[ 사용자명 ] : [ 비밀번호 ] : [ uid ] : [ gid ] : [ 사용자 계정 설명 ] : [ 홈 디렉토리 ] : [ 쉘 ]
각 계정은 콜론(:)으로 정보를 구분하여 담고있습니다.
| 사용자명 | 비밀번호 | uid | gid | 사용자 계정 설명 | 홈 디렉토리 | 쉘 |
|:------:|:-----:|:----:|:---:|:-----------:|:---------:|:--:|
| testuser | x | 1001 | 1001| | home/testuser | /bin/sh |
위에서 디렉토리를 직접 설정해주어야한다했는데, 디렉토리가 지정되어있습니다.
하지만 실제로는 home 디렉토리가 만들어지지 않아 사용을 할 수 없습니다.
# 사용자 생성하고 홈 디렉토리는 미생성 $ useradd testuser # 사용자 홈 디렉토리를 /home/testuser으로 자동 생성 $ useradd -m testuser
명령어 | 설명 |
---|---|
-d, --home | 홈 디렉토리 지정 |
-D, --default | 사용자 생성 시 사용하는 기본값을 보거나 설정 |
-e, --expriedate | yyyy-MM-dd 형식으로 계정의 만기일 지정 |
-f, --inactive | 패스워드 만료일 이후 유효기간을 설정 1 이상의 숫자이면 해당 일 수 만큼 패스워드 유효 0이면 만료되면 바로 잠김. -1이면 해당 기능을 사용하지 않음. |
-g, --gid Group | 사용자 그룹 설정. 설정하지 않으면 사용자 이름과 동일한 그룹에 설정 |
-G, --groups | 기본 그룹 이외에 추가로 그룹을 생성할 때 |
-k, --skel SKEL_DIR | -m 옵션을 통해 홈 디렉토리 생성할 때 복사할 기본 파일을 지정할 때 사용 |
-m, --create-home | 홈 디렉토리를 지정할 때 사용하고 디렉토리가 없으면 생성 -k 옵션과 같이 사용해서 홈 디렉토리 생성 시 복사할 기본 파일 경로도 지정 |
-M | 홈 디렉토리를 생성하지 않음 |
-N, --no-user-group | 사용자와 동일한 이름으로 그룹을 생성하지 않음 |
-p, --password | 평문이 아닌 암호화된 패스워드를 설정 |
-r, --system | 시스템 계정을 생성 |
-s, --shell | 사용자가 사용할 쉘을 지정 |
-u, --uid | 사용자 유일한 UID값을 설정 |
root@ubuntu-server-22:/# sudo useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/sh SKEL=/etc/skel CREATE_MAIL_SPOOL=no
사용자의 홈 디렉토리를 지정하는 옵션으로, 중간 경로가 있을 경우 미리 생성해주어야합니다.
별도 지정하지 않으면 -D를 통해 확인했던 HOME값인 /home에 '사용자명'으로 자동 생성됩니다.
# 사용자 홈 디렉토리를 /home/testuser으로 자동 생성 $ useradd -m testuser # 기본적으로 useradd는 /home에 사용자의 홈 디렉토리를 생성. # 사용자의 홈 디렉토리를 다른 위치에 작성하려면 d(--home) 옵션을 사용 $ useradd -m -d /home/color/testuser testuser
사용자의 uid를 설정하는 옵션으로 별도 지정하지 않을 경우, uid는 자동 발번되어 추가됩니다.
#특정 UID를 가진 사용자를 생성 $ useradd -u 999 testuser $ useradd -u [UID숫자] [유저명] # 사용자의 UID를 확인 $ id -u testuser
사용자가 소속될 그룹을 지정하는 옵션으로, 옵션을 생략할 경우, 아이디와 동일한 그룹에 포함시킵니다.
옵션을 이용하여 gid를 지정할 경우, 해당 gid가 반드시 생성되어 있어야만 한다.
# 그룹을 지정하여 사용자를 생성. 단, 그룹은 미리 생성되어 있어야함. $ useradd -g groupname testuser $ useradd -g [그룹명] [유저명]
리눅스 사용자는 하나 이상의 그룹에 속하게 되어있습니다.
그래서 사용자를 추가할 때, 자동으로 gid도 발번됩니다.
# 사용자 추가 $ adduser -m testuser2 $ tail -1 /etc/passwd testuser2:x:1002:1002:testuser2,1001,01011111111,none,none:/home/testuser2:/bin/bash # testuser2는 gid값이 자동으로 생성되어 1002번을 사용하고 있다. # test3를 1002번과 같은 gid 를 사용하게 사용자를 추가해보자. $ useradd -m -g 1002 testuser3 $ tail -1 /etc/passwd testuser3:x:1003:1002::/home/testuser3:/bin/sh
-g
로 그룹 id값을 지정했더니 testuser3도 1002번의 gid값을 가진다.
사용자는 한 개가 아닌 한 개 이상의 그룹에 속할 수 있다.
# 1차 그룹은 1002 2차 그룹은 1001번 그룹에 속하도록 계정을 추가. $ useradd -g 1002 -G 1001 testuser4 # 계정 추가 확인 $ tail -1 /etc/passwd testuser4:x:1004:1002::/home/testuser4:/bin/sh
추가가 되었지만 1001번으로 지정한 정보는 나오지 않고 UID(1004)와 GID(1002)만 나타내진다.
2차 그룹을 확인하는 방법은
# group에서 "testuser4"가 포함된 부분 출력 $ cat /etc/group | grep testuser4 testuser:x:1001:testuser4 # [그룹명]:[비밀번호]:[GID]:[같은 그룹에 속한 계정] # testuser의 그룹 1001번에 testuser4 계정이 존재.
그룹이 여러 개일 시, 한 줄씩 본인이 포함된 그룹의 정보를 보여줍니다.
$ cat /etc/group | grep macarong adm:x:4:syslog,macarong cdrom:x:24:macarong sudo:x:27:macarong dip:x:30:macarong plugdev:x:46:macarong lxd:x:110:macarong macarong:x:1000: [그룹명]:[비밀번호]:[GID]:[같은 그룹에 속한 계정]
--comment
의 줄임말로 -c를 사용하여 사용자의 설명을 추가합니다.
# 새로 추가하는 유저에 코멘트를 달 경우, useradd -c "New Comment User" testuser # 기존 코멘트를 변경할 경우, chmod -c "Change Comment User" testuser # 확인 $ cat /etc/passwd testuser:x:1001:1001:Change Comment User:/home/testuser:/bin/bash
명령어 | 설명 |
---|---|
-d, --lastday | 패스워드를 변경해야 할 날짜수 변경 |
-E, --expiredate | 계정이 만료되는 날 설정 |
-I, --inactive | 계정 만료 후 패스워드 비활성화 할 때까지 유예기간을 설정 |
-l, --list | 계정의 패스워드 만료 정보를 보여줌 |
-m, --mindays | 패스워드 변경할 때 최소 날짜를 지정 |
-M, -maxdays | 패스워드 변경할 때 최대날짜 지정 |
-W, --warndays | 패스워드 만료에 대한 경고 메시지를 보여줄 날짜를 지정 |
계정 만기일을 설정하는 명령어로 yyyy-MM-dd
포맷을 통해 설정한다
# 새로운 유저를 생성할 때, $ adduser -e 2022-12-24 testuser4 # 기존 유저의 만료일을 수정할 때, (크리스마스에 혼자 있고 싶으니깐 전에 나가;) $ chage -E 2022-12-24 testuser4 # 만료일 조회 $ sudo chage -l testuser4 Last password change : Nov 24, 2022 Password expires : never Password inactive : never Account expires : Dec 24, 2022 Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
설정 기준으로 패스워드를 며칠동안 사용할지 설정하도록 합니다.
만료 시 변경해주어야 합니다.
# 새로운 계정 생성 시 $ useradd -f 3 testuser4 # 기존 계정 변경 시 $ chage -m 3 testuser4 $ sudo chage -l testuser4 Last password change : Nov 24, 2022 Password expires - : never Password inactive : never Account expires : Dec 24, 2022 Minimum number of days between password change : 3 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
root@ubuntu-server-22:/# cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/bash /usr/bin/bash /bin/rbash /usr/bin/rbash /usr/bin/sh /bin/dash /usr/bin/dash /usr/bin/tmux /usr/bin/screen
사용자의 셸을 지정하는 옵션입니다.
옵션을 지정하지 않으면, '/etc/default/useradd' 파일의 기본 설정을 따른다.
기본 쉘 : SHELL = /bin/sh
# 기본 로그인 쉘을 /bin/sh에서 /bin/bash로 변경 $ sudo useradd -D -s /bin/bash # 기본 쉘 값이 변경되었는지 확인 sudo useradd -D | grep -i shell SHELL=/bin/bash
다음 명령어를 사용하면 새로 바꿀 비밀번호(New password)를 물어보고, (Retype new password)를 통해 비밀번호를 재확인 한 후, 변경을 완료시킵니다.
$ passwd [옵션] [username] Changing password for user username. New password: Retype new password: passwd : all authentication tokens updated successfully.
명령어 | 설명 |
---|---|
-d, --delete | 패스워드 삭제, 비밀번호 없이 로그인 가능 |
-e, -expire | 사용자의 패스워드를 만료 |
-i, --inactive | 패스워드 만료 후 비활성화 전 유예기간 일 지정 |
-l, --lock | 사용자 패스워드에 락을 걸어 로그인을 막음 |
-n, --mindays | 비밀번호를 변경할 수 있을 때까지 유지해야할 일 수 설정 |
-q, --quiet | 화면 출력없이 명령을 수행 |
-S, --status | 사용자의 로그인명, 패스워드 상태, 설정여부, 마지막으로 변겨안 날짜, 패스워드 변경까지 남은 기간 등 다양한 정보 출력 |
-u, --unlock | 락을 걸었던 패스워드를 다시 해제 |
-w, --warndays | 패스워드 만료 전 경고날짜 지정 |
-x, --maxdays | 최대 사용기간 설정 |
# 다른 사용자의 권한으로 실행 $ su [options] [username]
su : switch user의 약자
[username]값이 비어있을 경우 자동으로 root값으로 변경.
옵션 | 설명 |
---|---|
-c, --command | 지정한 사용자로 쉘이 실행할 명령어 지정 |
-, -l, --login | 사용자가 직접 로그인했을 때 동일하게 환경변수가 설정되고 홈 디렉토리로 이동 |
-s, --shell | 명시된 쉘 사용 |
사용자 쉘, 홈 디렉토리, 그룹, UID, GID 사용자 설정을 변경합니다.
useradd 명령어의 설정 대부분 적용 가능.
$ usermod [옵션] username
옵션 | 설명 |
---|---|
-a, --append | 사용자에 그룹 추가하기 위해 -G 옵션과 사용 |
-c, --comment | 사용자에 간단한 정보 입력 |
-l, --login | 로그인 이름 변경 |
-L, --lock | 패스워드에 락을 걸음 |
-U, --unlock | 패스워드 락 해제 |
# 사용자 홈 디렉토리 변경. -m 옵션까지 입력하면 내용도 복사 $ usermod -d /home/changedir testuser # 사용자 그룹을 photo 사용자 그룹으로 변경 $ usermod -g photo testuser
$ userdel [옵션] [username] # 계정삭제. 단, 홈 디렉토리 파일은 남아있음. $ userdel testuser # -r 옵션을 통해 사용자 계정 홈 디렉토리도 삭제 $ userdel -r testuser # -f옵션으로 강제 삭제 $ userdel -f testuser
# userdel이랑 같지만 옵션명이 다릅니다. $ deluser [username] # 홈 디렉토리 삭제 $ deluser --remove [username] # 홈 디렉토리, 계정명으로된 모든 파일 삭제 $ deluser --remove-all-files [username]
home이나 passwd에 유저 디렉토리, 정보를 삭제해서 계정 삭제하는 방법도 존재한다.
ㅌ>
# 홈 디렉토리 및 하위폴더 삭제
$ sudo rm -r /home/[username]
>
# /etc/passwd 에서 해당 내용 삭제
$ sudo vi /etc/passwd
그룹이란 사용자를 묶어 관리하게 하는 매커니즘이다.
그룹을 통해 각 그룹에 보안설정, 접근설정, 권한등을 일괄 적용 관리할 수 있다.
모든 사용자는 UID와 그룹에 대한 식별자인 GID를 가진다.
사용자 생성 시 기본으로 사용자 이름과 동일한 그룹으로 생성하여 포함됨.
# 특정 사용자나 현재 로그인한 사용자가 속한 그룹을 표시 $ groups
$ groupadd [옵션] groupname
옵션 | 설명 |
---|---|
-f, --force | 그룹을 생성할 때 이미 생성되어 있더라도 성공으로 간주 |
-r, --system | 시스템 그룹을 생성 |
-g, --gid GID | 그룹의 양수의 GID를 지정 |
-o, --non-unique | 그룹을 생성할 때 중복된 GID값 허용 |
# GID 지정하여 그룹을 생성 $ sudo groupadd -g 550 groupname
옵션 | 설명 |
---|---|
-g, --gid | 변경할 GID 설정 -o 옵션을 주지 않는다면 유일한 정수값 |
-n, --new-name | 그룹의 이름을 변경 |
# lastest 그룹 이름을 new 그룹으로 변경 $ sudo groupmod -n new lastest # GID를 567로 변경 $ sudo gorupmod -g 567 lastest
그룹관려 설정파일인 /etc/group/
, /etc/gshadow/
, /etc/passwd/
에서 그룹관련 속성을 변경할 수 있습니다.
그룹을 삭제하기 위해선 주 그룹에 존재하는 사용자가 없어야합니다.
(사용자를 삭제한 후 그룹을 삭제할 수 있음.)
또한 파일 중 그룹이 설정된 파일이 없어야 한다.
$ sudo groupdel [groupname]
그룹 패스워드 변경만이 아닌 앞에서 본 그룹 추가/삭제 등 전반적인 그룹 관리 마스터 명령어입니다.
$ gapsswd [옵션] [groupname]
옵션 | 설명 |
---|---|
-a, --add user | 그룹에 사용자를 추가 |
-d, --delete user | 그룹에서 사용자 삭제 |
-r, --remove-password group | 그룹의 패스워드 제거 그룹 멤버는 newgrp 명령어를 사용해 그룹에 참가 |
-R, --administrator user .. | 그룹 접근 제한 패스워드를 가진 그룹멤버만 newgrp통해 그룹에 참가 |
-A, -administrator user.. | 관리자로 지정할 사용자 설정 |
-M, --members user.. | 그룹멤버 설정 |
그룹의 패스워드 정보는 /etc/group
과 /etc/gshadow/
에 저장되어 있습니다.
만일 참여하려는 그룹에 그룹패스워드가 존재하는데, 사용자가 명령어를 통해 그룹에 참여하려면 패스워드 입력이 필요합니다.
# 현재 그룹대신 [newgroupname] 그룹으로 전환 $ newgrp [newgroupname]
사용자 계정과 그룹 정보는 /etc 디렉토리 이하에 존재합니다.
구분 | 파일명 | 설명 |
---|---|---|
계정 및 그룹 설정파일 | /etc/passwd | 사용자 계정의 아이디, 그룹정보 등 계정정보 |
/etc/shadow | 암호화된 패스워드 및 정책 설정 정보 | |
/etc/group | 사용자 그룹의 기본정보 | |
/etc/gshadow | 사용자 그룹의 암호화된 패스워드 정보 | |
계정 환경설정 파일 | /etc/default/useradd | useradd명령을 사용할 때 기본 사용자 부가정보 |
/etc/login.defs | 로그인 수행 시 기본설정 | |
/etc/skel | 홈 디렉토리 생성 시 기본으로 제공할 파일 |
$ cat /etc/passwd [사용자명]:[비밀번호]:[UID]:[GID]:[사용자설명]:[홈 디렉토리]:[쉘 경로] # 사용자명 : 로그인할 때 사용하는 사용자 이름. # 비밀번호 : x는 그냥 암호화된 패스워드를 보관하고 있다는 의미. # UID : 사용자 번호 # GID : /etc/group 파일에 보관된 주 그룹 ID번호 # 사용자 설명 : 사용자에 대한 추가설명 코멘트 필드 # 홈 디렉토리 : 기본 디렉토리로 절대경로로 설정 # 쉘 : 쉘의 위치를 절대 경로로 지정.
$ cat /etc/shadow testuser:$y$j9T$r8DsO/2/jn/G.Heds.$25bmLpaxoM.Ld2o9P3DSE3ew.C9Uw31D7tYMeiFdTMA:19319:0:99999:7::: [사용자명]:[패스워드]:[마지막 변경일]:[패스워드]:[최소 사용일]:[최대 사용일]:[만료 경고일]:[유예기간]:[만료일]
$ cat /etc/group | grep mail mail:x:8: [그룹명]:[패스워드]:[GID]:[멤버목록]
$ cat /etc/gshadow testuser:!::testuser4 [그룹명]:[패스워드]:[그룹관리자]:[멤버목록]
root 사용자로 로그인했을때 내용이 안보일수 있나요? 전 문외한인데 동생이 마지막으로 남긴걸 보려고 하는데 막막해서요.