티스토리 뷰

서두

사용자와 그룹은 시스템 관리에 필수 요소이다. 시스템에 사용자가 없다면 시스템에 로그인이 불가능하여 시스템 자체의 의미가 사라진다. 

 

또한, 유저와 그룹 등 다양한 파일/디렉토리에 대한 접근 권한을 설정하여 보안처리에도 사용된다.

시스템 사용자 관리는 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가지 전제 조건이 필요하다.

  1. 명령어를 사용하려는 일반 유저의 패스워드를 알아야한다.
  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
링크
«   2024/05   »
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
글 보관함