티스토리 뷰
서두
사용자와 그룹은 시스템 관리에 필수 요소이다. 시스템에 사용자가 없다면 시스템에 로그인이 불가능하여 시스템 자체의 의미가 사라진다.
또한, 유저와 그룹 등 다양한 파일/디렉토리에 대한 접근 권한을 설정하여 보안처리에도 사용된다.
시스템 사용자 관리는 root 사용자의 권한이 필요하다.
1.1 사용자 및 그룹 정보 파일
리눅스는 계층적 파일 시스템이다. 리눅스의 파일들은 트리 형태로 root라는 최고 권한 파일 아래 다른 파일들이 프로세스를 작동시키며 동작한다. 하여 보안상 이유로 시스템을 사용하는 유저들은 각 개인마다 파일들에 대한 접근 권한이 다르게 설정된다.
멀티 유저 & 멀티 테스킹
📌 리눅스의 가장 중요한 포인트
- 동시에 여러 유저가 동일 시스템을 접속하여 사용하는 것으로, 네트워킹을 통해 접속한다.
- 동시에 여러 프로세스를 실행시키고 사용할 수 있다.
리눅스를 사용하는 이유는 높은 이식성과 확장성도 있지만 멀티 유저와 멀티 테스킹 지원이 가장 중요하다. 위에 언급한 파일 시스템과 권한 설정, 사용자 설정 등 모두 이 기능들을 제공하기 위하여 설정된 안전 장치라 생각할 수 있다.
리눅스는 접근 권한을 컨트롤하기 위해 리눅스는 두 가지 정보를 사용한다.
유저 권한 (User)
📌 리눅스를 사용하는 유저
사용자(User)는 리눅스 시스템을 사용하는 사람을 말한다. (*지금부터는 편리하게 유저라 일컫겠다.)
유저는 두 가지 방식으로 판별된다.
유저 이름
유저 이름은 통상 사람이 사용하는 이름과 같다.
유저가 처음 생성될 때, 같이 지정되며 해당 유저를 부르는 영문 이름이 된다.
UID (User ID)
UID는 사용자 지정 아이디라는 의미이며 컴퓨터가 유저를 식별하는 기준이된다. 또한, UID는 절대 중복되어 선언되지 않아야 한다.
유저 이름이 다른 두 사용자가 같은 UID를 공유한다면, 시스템은 같은 사람으로 인식한다. 하지만, 이는 보안상 문제가 초래할 수 있어서 사용하지 않는 것이 맞다.
그룹 (Group)
📌 공통의 목적을 가진 사용자들을 집합시켜 파일 권한을 공유하는 기능
그룹은 공통의 목적을 가진 사용자들을 집합시켜 파일 권한을 공유하는 것이다.
즉, 같은 디렉토리에서 일해야 협업을 해야하는 사람들끼리 같은 레벨의 권한을 부여하는 것이다.
모든 유저는 최소 하나의 그룹에는 소속되어 있어야한다. 이를 위해 그룹 시스템은 기본 그룹과 보조 그룹이 존재한다.
기본 그룹
기본 그룹은 모든 유저가 기본적으로 속해있는 그룹이며 따로 지정해 주지 않는다면, 유저 이름으로 그룹을 임의로 생성하여 유저 그룹에 강제로 포함시켜버린다.
보조 그룹
보조 그룹은 같은 목표를 가진 유저를 묶어 동일한 권한을 주어 일일이 유저마다 권한 설정을 하지 않고 협업이 가능하도록 만드는 기능이다.
root 유저의 권한으로 다른 유저의 보조 그룹을 추가하는 예제
# Hong0라는 유저의 UID, GID 확인
[root@servera log] # id Hong0
uid=1001(Hong0) gid=1001(Hong0) groups=1001(Hong0)
# Hong0라는 유저의 추가 그룹에 Hong1,Hong2,Hong3 추가
[root@servera log] # usermod -G Hong1,Hong2,Hong3 -a Hong0
# Hong0라는 유저의 UID, GID 재확인
[root@servera log] # id Hong0
uid=1001(Hong0) gid=1001(Hong0) groups=1001(Hong0),1002(Hong1),1003(Hong2),1004(Hong3)
결론
기본 그룹 | 반드시 포함되는 그룹이다. |
보조 그룹 | 필수는 아니지만 같은 목적을 가진 여러 그룹에 포함될 수 있다. |
그룹도 유저와 같이 시스템에게 식별되기 위해 그룹명과 GID라는 고유 식별자를 가진다.
그룹 이름
그룹마다 지정되는 영문 이름 값이다.
GID (Group ID)
GID는 UID와 마찬가지로 시스템이 그룹을 식별하기 위해 정의된 식별자이다.
1.1.2 사용자와 그룹 파일
📌 리눅스를 관리하는 정보를 담은 파일들
리눅스는 4개의 파일을 사용하여 유저와 그룹의 정보를 저장한다.
각 파일은 손상되거나 변경이 되면 어떠한 오류가 나타날지 모르기에 직접 수정하기 보다 명령어들을 통해 수정하는 것이 권장된다.
/etc/passwd | /etc/shadow | /etc/group | /etc/gshadow |
사용자 정보 포함 | 사용자 패스워드 데이터 포함 | 사용자 그룹 데이터 포함 | 사용자 그룹 패스워드 포함 |
/etc/passwd
passwd파일은 유저의 전체적은 정보를 압축하여 저장한다. 편집기를 통해 내부 정보를 수정을 할 수 있지만 문제가 발생할 수 있다.
passwd파일 엿보기
# passwd 파일의 최상단 5개의 문자열 출력
[root@servera log] # head -5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
passwd 정보 중 root 정보 분석하기
USER | PASSWORD | UID | GID | COMMENT | HOME | SHELL |
root | X | 0 | 0 | root | /root | /bin/bash |
루트 계정 이름 | 루트 계정 비밀번호 여부 |
루트 계정 UID | 루트 계정 GID | 루트 계정 별칭 | 루트 계정 홈 | 루트 계정 쉘 |
명칭 | 설명 |
USER | 유저의 이름 |
X or !! | 비밀번호 설정 유무를 표현 (X = 비밀번호 설정 완료, !! = 비밀번호 미설정) |
UID | 유저의 UID |
GID | 유저의 GID |
Comment | 해당 아이디를 설명하는 별칭 |
Home directory | 해당 아이디가 사용하는 홈디렉토리 경로 |
SHELL | 해당 아이디가 실행하는 기본 쉘 프로그램의 경로 |
passwd파일의 정보는 위 패턴을 따른다. 각 데이터는 ":"를 기준으로 나뉘어 읽을 수 있다.
추가적으로 알아두면 좋은 정보는 유저 번호는 999까지 시스템에서 사용하는 UID로 지정되어 새로운 유저 정보를 만들면 1000번 부터 생성한다.
보통은 다음과 같다.
0~200 | 201~999 | 1000~60000 |
정적 시스템 UID | 동적 시스템 UID | 일반 사용자 UID |
시스템 UID의 범위는 리눅스마다 다르기 때문에 확인해 두면 좋다.
/etc/shadow
shadow파일은 유저의 패스워드 정보를 해시패스워드 형태로 저장한다. shadow 파일은 관리자 외 접근이 차단되고, 복호화가 어려워 패스워드가 안전하다.
shadow파일 엿보기
# shadow 파일의 최상단 5개의 문자열 출력
[root@servera log] # head -5 /etc/shadow
root:$6$.lC7loQynVEhPIHw$SUEhy.veXff1mOpFuaxjfvnXRs.vLu5h2gzuClhYADcbD926PTn7Nv1ZSdPpJGVK0LTbBc54.ins6OXZQ1unS1:19461:0:99999:7:::
bin:*:19295:0:99999:7:::
daemon:*:19295:0:99999:7:::
adm:*:19295:0:99999:7:::
lp:*:19295:0:99999:7:::
명칭 | 설명 |
USER | 유저의 이름 |
HASH | 해시 알고리즘으로 생성된 패스워드 |
LASTCHANGE | 마지막 패스워드 수정 시간 |
MIN | 패스워드 변경 후 최소 사용 기간 |
MAX | 패스워드 변경 후 최대 사용 기간 |
WARNING | 패스워드 만료 전 경고문을 출력하는 시간 |
INACTIVE | 패스워드 만료 후 INACTIVE에 지정한 시간 안에 패스워드 변경을 하지 않으면 계정 잠금 상태로 전환 |
EXPIRE | 계정 만료일 |
BLANK | 사용되지 않는 필드 |
/etc/group
group파일은 유저의 그룹 정보를 저장한다. 생각보다 간단한 정보들이 들어있다.
대부분 사용자 생성시 똑같은 이름의 그룹도 생성된다.
group파일 엿보기
# group 파일의 최상단 5개의 문자열 출력
[root@servera log] # head -5 /etc/shadow
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3
adm:x:4:
명칭 | 설명 |
GROUP | 그룹 이름 |
X | 비밀번호 설정 유무를 표현 (X = 비밀번호 설정 완료, !! = 비밀번호 미설정) |
GID | 그룹의 GID |
MEMBER | 보조 그룹으로 지정하는 사용자 목록 |
/etc/gshadow
gshadow파일은 그룹 정보의 패스워드를 해시 알고리즘으로 변경하여 저장한다.
대부분 사용자 생성시 똑같은 이름의 그룹도 생성된다.
gshadow 파일 엿보기
# group 파일의 최상단 5개의 문자열 출력
[root@servera log] # head -5 /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::
명칭 | 설명 |
GROUP | 해당 그룹 이름 |
PASSWORD | 해당 그룹 암호 |
ADMIN | 해당 그릅 관리자 |
MEMBER | 해등 그룹 멤버들 |
1.2 사용자 및 그룹 관리
/etc/skel & /etc/login.defs
📌 사용자 생성에 필요한 기본 정보를 모두 포함한 디렉토리
skel
skel은 뼈대(skeleton)의 약어로 유저를 생성할 때, 만들어지는 홈디렉토리 파일들의 원본이다.
즉, 유저를 생성하며 만들어지는 홈디렉터리는 /etc/skel 디렉토리를 복제한 것이다.
이 디렉토리로 초기 사용자 환경 설정을 변경하여 원하는 각 유저마다 동일한 초기 환결 설정을 만들 수 있다.
login.defs
login.defs는 그룹 생성에 필요한 기본 값이 입력되어 있다.
앞서 언급한 홈디렉토리 생성 여부를 이 파일에서 결정한다.
사용자 생성
📌 신규 사용자 정보를 정의하고 시스템에 인식시킨다.
useradd [옵션] user-name
명칭 | 설명 |
-u UID | 사용자 UID 지정 |
-U | 사용자 생성시 사용자 명칭과 같은 그룹 생성 |
-g GID | 기본 그룹 지정 |
-G GID | 보조 그룹 지정 |
-c COMMENT | 커맨트 입력 |
-d HOME | 홈 디렉토리 경로 설정 |
-s SHELL | 기본 쉘 경로 설정 |
-o | 다른 유저와 UID 중복을 허용 (주의) |
-r | 199~999 UID 부여 가능, 시스템 계정 생성에 사용 |
-m | 사용자 홈 디렉토리가 없는 경우 생성 * /etc/login.defs 파일 CREATE_HOME 항복이 "yes"가 아니며, 해당 옵션을 사용하지 않는 경우 홈 디렉토리가 생성되지 않는다. |
-e EXPIRE | /etc/shadow EXPIRE 필드 값 지정 |
-f INACTIVE | /etc/shadow INACTIVE 필드 값 지정 |
유저를 생성하기 위해서는 useradd 명령어를 사용한다.
위 명령어로 유저를 만들면 /etc/passwd와 /etc/shadow의 마지막 줄에 생성한 유저의 정보가 입력된다.
유저를 처음 생성하면 패스워드가 설정되어 있지 않다. 그래서 passwd 파일을 확인하면 "!!"로 처리되어 있고 passwd 명령어로 따로 설정해주어야 한다.
연습하기
이름 | UID | 기본 그룹 | 홈 디렉토리 | 기본 쉘 |
user03 | 2000 | 10 | /home/guest/user03 | /bin/sh |
useradd -u 2000 -g 10 -d /home/guest/user03 -s bin/sh user03
사용자 정보 수정
📌 기존 사용자 정보를 수정한다.
usermod [옵션] user-name
명칭 | 설명 |
-u UID | 사용자 UID 변경 |
-g GID | 기본 그룹 변경 |
-G GID | 보조 그룹 변경, 기존 보조 그룹 정보 삭제 |
-c COMMENT | 커맨트 변경 |
-d HOME | 홈 디렉토리 경로 변경 |
-s SHELL | 기본 쉘 경로 변경 |
-o | UID 변경 중 다른 유저와 UID 중복을 허용 (주의) |
-a | -G와 같이 사용하여 보조 그룹 추가에 사용 |
-m | - d와 같이 사용하여 홈 디렉토리 변경에 사용 |
-e EXPIRE | /etc/shadow EXPIRE 필드 값 변경 |
-f INACTIVE | /etc/shadow INACTIVE 필드 값 변경 |
-L | 지정 유저 잠금 상태로 변경 |
-U | 지정 유저 잠금 상태 해제 |
기존 유저 정보를 변경하기 위한 명령어이다.
여기서 '-a' 옵션은 '-G' 옵션에서 한 번에 한개 이상의 보조 그룹을 추가할때 같이 사용해야하는 것을 주의하자.
연습하기
한 유저에게 복수의 유저 그룹 추가하기
usermod -G user01 -a user02,user03,user04
사용자 삭제
📌 기존 사용자 정보를 제거한다.
userdel [옵션] user-name
userdel 명령어는 '-r'와 함께 사용하는 것만 주의하자.
'-r'을 사용할 경우 유저의 정보와 함께 홈디렉토리의 모든 파일도 같이 삭제한다.
'-r'을 사용하지 않은 경우 유저 정보만 제거되고 홈디렉토리 파일들이 남아있다.
그룹 생성
📌 신규 그룹 생성
groupadd [옵션] group-name
명칭 | 설명 |
-g | 그룹 생성 시 그룹 GID 설정 |
-o | 중복 GID 설정 허용 |
-r | 시스템 그룹 생성, 201~999 GID 부여 가능(사용하지 않는 번호만) |
그룹 정보 수정
📌 기존 그룹 수정
groupmod [옵션] group-name
명칭 | 설명 |
-g | 그룹 GID 변경 |
-o | 중복 GID 설정 허용하여 GID값 변경 |
-n | 지정된 그룹의 그룹명칭 변경 |
-p | 지정 그룹 패스워드 변경 |
그룹 삭제
📌 기존 그룹 삭제
groupdel group-name
1.3 사용자 전환
su
📌 switch user 명령어
su [-] user-name
su 명령어는 원하는 유저로 전환할 수 있도록 하는 명령어이다.
이는 패스워드를 안다는 전제 조건 하에 실행된다. 단, root 유저가 일반 유저로 전환할 때는 패스워드가 필요하지 않다.
su 명령어는 '-' 옵션만 존재한다. '-' 옵션은 유저를 변경할 때, 유저가 마지막으로 있던 디렉토리 경로(환경 설정)을 유지하고 변경할 것인가 결정한다.
- '-'을 선언할 경우, 변경할 목표 유저의 홈 디렉토리로 이동한다.
- '-'을 선언하지 않은 경우, 현재 유저가 있는 디렉토리 경로에서 변경할 목표 유저로 들어온다.
# Hong1에서 root로 '-'옵션 없이 유저 변경
# 환경 변수 유지
[Hong1@servera log] $ su root
Password:
# root에서 Hong1으로 '-'옵션을 통해 유저 변경
# 환경 변수 초기화
[root@servera log] # su - Hong1
Last login: Tue Oct 31 09:58:39 UTC 2023 on pts/0
# Hong1의 홈디릭토리에서 시작
[Hong1@servera ~] $
sudo
📌 super user do!
sudo [옵션] user-name [커맨드]
sudo는 root가 아닌 일반 유저가 root 권한이 필요한 작업을 위해 root권한을 빌려 사용하는 명령어이다.
sudo는 2가지 전제 조건이 필요하다.
- 명령어를 사용하려는 일반 유저의 패스워드를 알아야한다.
- /etc/sudoer 파일에 등록 되어야한다.
- 현재 리눅스는 이 방법을 보안상 이유로 더이상 권장하지 않고, 시스템 그룹 중 'wheel' 그룹에 sudo 권한을 사용할 수 있는 계정들을 보조 그룹에 포함 시키는 것으려 변경했다.
sudo는 유저를 변경하지 않고 특정 유저의 권한을 사용하도록 해준다. 단, 일시적으로 명령을 수행하는 것이라는 것을 기억해야한다.
-i 옵션
📌 sudo의 '-i' 명령어는 독특한 놈이다.
'-i' 옵션은 su의 '-' 옵션과 비슷하게 동작한다.
옵션을 설정하고 커맨드를 입력하면 권한을 부여해주는 유저의 홈 디렉토리에 해당 명령이 수행된다.
물론, 모든 전제는 해당 유저 홈 디렉토리에 대한 권한이 부여되었을 경우이다.
또한, '-i' 옵션을 사용하며 커맨드를 입력하지 않고 변경할 유저만 입력하면, 'su -'와 같은 효과를 낸다.
일반 유저에게 wheel 그룹 권한 부여
# Hong1유저를 wheel 그룹에 추가
[root@servera Hong1] # usermod Hong1 -aG wheel
[root@servera Hong1] # id Hong1
uid=1002(Hong1) gid=1002(Hong1) groups=1002(Hong1),10(wheel),1001(Hong0)
일반 유저로 sudo 권한 사용
# Hong1 유저가 root 권한으로 Hong1 디렉토리에 파일 생성
[Hong1@servera ~] $ sudo touch fileA
[sudo] password for Hong1:
# root 권한으로 root 디렉토리에 fileB 생성
[Hong1@servera ~] $ sudo -i touch fileB
# file 찾기
[Hong1@servera ~] $ sudo find / -name "file[AB]" -ls
67192532 0 -rw-r--r-- 1 root root 0 Oct 31 10:15 /root/fileB
67192530 0 -rw-r--r-- 1 root root 0 Oct 31 10:15 /home/Hong1/fileA
# root 유저로 변경
[Hong1@servera ~] $ sudo -i
# root 유저로 변경 성공
[root@servera ~] #
su와 sudo 로그
서로 권한을 빌리고 계정을 전환하는 것은 필수지만 항상 위험이 따른다.
하여 /var/log/secure 파일에 항상 전환과 권한 사용에 대한 로그가 남는다.
1.4 사용자 패스워드
해시 패스워드
📌 해시 알고리즘 구성 요소
su [-] user-name
앞서 유저 shadow 파일에 대해 언급하며 해시 패스워드에 대해 간략히 말했다.
패스워드들은 유저 생성 후 passwd 명령어로 따로 각 유저에 선언되고 각 패스워드는 shadow 파일에 해시 알고리즘으로 암호화가 되어 입력된다.
$6$.lC7loQynVEhPIHw$SUEhy.veXff1mOpFuaxjfvnXRs.vLu5h2gzuClhYADcbD926PTn7Nv1ZSdPpJGVK0LTbBc54.ins6OXZQ1unS1
위는 해시 패스워드의 예제이다. 자세히 보면 3개의 "$" 문자를 확인할 수 있다.
각 속성은 해시 알고리즘 종류 / 솔트 / 해시 암호이다.
HASH 구성요소
위 구성요소 중 비밀번호가 암호화된 HASH 부분을 보면 약간의 패턴이 보인다. 해시의 부분부분이 "$"문자로 나뉘어져 있다. 이는 해시가 어떤 암호화 시스템으로 암호화 되었는지 알수 있다.
처음 $ 구문 | 중간 $ 구문 | 마지막 $ 구문 |
[$Hash 종류] | [$salt] | [$Hash 결과] |
해시 알고리즘의 종류를 의미한다. $1 : MD5 $2 / $2a / $2y : Blowfish $5 : SHA-256 $6 : SHA-512 |
암호화에 사용되는 salt 값으로 총 16자리의 랜덤 문자를 생성한다. | 앞 두 정보를 토대로 생성된 해시 암호 |
chage - 패스워드 속성 변경
📌 패스워드의 유저와 패스워드를 제외한 값을 변경
사용자의 패스워드는 /etc/login.defs 파일의 패스워드 에이징 설정으로 자동 설정된다. 하지만 사용자의 패스워드 속성은 수시로 변경되야할 수 있다.
chage명령어는 패스워드에 속성을 변경할 수 있다.
chage명령어는 root 권한자만 사용이 가능하다.
'Computer > Linux' 카테고리의 다른 글
[Linux] ln 명령어 (0) | 2023.10.17 |
---|---|
[Linux] cat 명령어 (0) | 2023.10.17 |
[Linux] touch 명령어 (1) | 2023.10.17 |
[Linux] 쉘 (Shell) 01 (0) | 2023.09.22 |
[Linux] 입출력 재지정 (IO Redirection) - 입력 재지정 (0) | 2023.09.20 |
- Total
- Today
- Yesterday
- 입출력
- static_cast
- 초기화
- 수학
- 클래스
- 메모리
- 레지스터
- 함수
- dynamic_cast
- 멀티스레드
- 상속
- 포인터
- 운영체제
- 프로세스
- const
- malloc
- 백준
- 게임수학
- 스레드
- 할당
- 인터럽트
- New
- thread
- 크기
- 컴파일
- CPU
- c++
- 명령어
- 구조
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |