- Published on
리눅스 사용자와 그룹
- Authors
- Name
- 신주용
리눅스는 다중 사용자 시스템입니다. 1대의 리눅스에 여러 명의 사용자가 동시 접속해서 사용 가능하다는 뜻입니다.
기본적으로는 root
라는 슈퍼 유저가 있습니다. root
유저는 모든 작업을 실행할 수 있는 권한을 갖고 있고, 시스템에 접속할 수 있는 사용자를 생성할 수 있는 권한도 있습니다.
리눅스의 모든 사용자는 혼자 존재할 수 없으며, 하나 이상의 그룹에 소속되어야 합니다.
사용자 확인
/etc/passwd
파일에는 리눅스 시스템에 등록되어 있는 모든 사용자 정보가 UserName:Password:UID:GID:FullName:HomeDir:DefaultShell
형식으로 기록되어 있습니다.
refo in /Users/refo at rocky
➜ cat /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
# ...
systemd-oom:x:994:994:systemd Userspace OOM Killer:/:/usr/sbin/nologin
refo:x:501:501::/home/refo:/bin/zsh
이 중 systemd-oom
까지는 리눅스에 기본으로 존재하는 표준 사용자이고, 아래부터 추가된 사용자 정보입니다. 제 경우에는 제 유저 이름인 refo
가 추가되어 있습니다.
유저의 비밀번호는 x
로 표시되어 있는데, /etc/shadow
파일에서 확인할 수 있습니다...만 암호회되어 알아볼 수는 없습니다.
refo in ~ at rocky took 4.8s
➜ tail -3 /etc/shadow
tail: cannot open '/etc/shadow' for reading: Permission denied
refo in ~ at rocky
➜ sudo tail -3 /etc/shadow
tss:!!:19737::::::
systemd-oom:!*:19737::::::
refo:$6$TPizjeFQ894~~~VvomswF3X.:19749:0:99999:7:::
그룹 확인
사용자 정보와 비슷하게 그룹 정보도 /etc/group
파일에 기록되어 있습니다. 형식은 GroupName:GroupPassword:GID:UserNamesInThisGroup
순서입니다.
refo in /Users/refo at rocky
➜ cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
# ...
systemd-oom:x:994:
refo:x:501:
이 파일도 systemd-oom
까지는 리눅스에 기본으로 존재하는 표준 그룹이고, 아래부터 추가된 그룹 정보입니다. 제 경우에는 유저 이름과 동일한 refo
가 그룹에도 추가되어 있습니다.
사용자와 그룹 관련 주요 명령
useradd
또는adduser
: 새 사용자를 추가하는 명령입니다.-g GroupName
: 사용자를 생성하면서 명시된 그룹에 추가합니다. 기본 값은 위에서 봤던 것처럼 사용자 이름과 동일한 그룹을 새로 생성합니다.-d Path
: 사용자 홈 경로로, 기본은/home/${USER}
입니다.-s Shell
: 기본 쉘은 보통은bash
일테니/bin/bash
로 되어 있을 것입니다.
refo in ~ at rocky ➜ useradd -g root -d /testhome -s /bin/zsh testuser1 refo in ~ at rocky ➜ cat /etc/passwd # ... refo:x:501:501::/home/refo:/bin/zsh testuser1:x:1000:0::/testhome:/bin/zsh # root 그룹이어서 GID = 0
passwd
: 유저 비밀번호를 지정합니다.refo in ~ at rocky ➜ sudo passwd testuser1 Changing password for user testuser1. New password: # 비밀번호 입력은 화면에 안 보이므로 오타를 조심합니다. BAD PASSWORD: The password is shorter than 8 characters # 1234 같은 간단한 비밀번호 입력하면 경고합니다. Retype new password: passwd: all authentication tokens updated successfully.
생성한
testuser1
로 로그인합니다.refo in ~ at rocky took 23.3s ➜ su testuser1 Password: [testuser1@rocky]/home/refo% cd [testuser1@rocky]~% pwd /testhome # 유저 생성 시 -d 옵션으로 바꿔준 홈 경로가 표시됩니다. [testuser1@rocky]~%
파일, 디렉터리 소유와 허가권
리눅스에서는 현재 디렉토리에 있는 파일과 디렉토리 목록을 볼 때 ls
명령어를 사용합니다. 이 때 -l
옵션을 사용하면 자세한 정보를 포함하여 목록을 볼 수 있습니다. 추가로 보이는 정보는 아래와 같습니다.
refo in ~ at rocky
➜ ls -lh
total 0
-rw-r--r-- 1 testuser1 root 0 Jan 27 16:55 sample
-rw-r--r--
: 파일 유형 + 허가권- 파일 유형
- 디렉터리인 경우
d
, 일반 파일인 경우-
, 장치를 의미하는b
,c
, 링크l
등으로 표기됩니다.
- 디렉터리인 경우
- 파일 허가권
- 3자리씩 끊어서 r(read, 읽기 권한), w(write, 쓰기 권한), x(execute, 실행 권한)를 나타냅니다.
- 첫번째는 파일 소유자의 권한, 두 번째는 그룹의 권한, 세 번째는 그 외 사용자의 권한입니다.
- 숫자로
0644
와 같이 표기하기도 합니다.
- 파일 유형
1
: 링크 수testuser1
: 파일 소유자 이름root
: 파일 소유 그룹 이름0
: 파일 크기(Byte). 이 파일은touch
로 생성한 빈 파일이라 0바이트로 나옵니다.Jan ...
: 마지막 변경 시각- 파일 이름
실습
파일을 생성하고 권한을 확인해 봅니다.
refo in ~ at rocky ➜ echo "date" > test.sh refo in ~ at rocky ➜ ls -lh total 4.0K -rw-r--r-- 1 refo refo 5 Jan 27 17:05 test.sh
실행 권한이 없는 파일은 실행할 수 없습니다.
refo in ~ at rocky ➜ ./test.sh zsh: permission denied: ./test.sh
현재 유저에게만 실행 권한을 주고 실행해 봅시다.
refo in ~ at rocky ➜ chmod 744 ./test.sh refo in ~ at rocky ➜ ls -lh total 4.0K -rwxr--r-- 1 refo refo 5 Jan 27 17:05 test.sh refo in ~ at rocky ➜ ./test.sh Sat Jan 27 05:08:25 PM KST 2024
root
유저, 그룹으로 바꿔보고 실행해 봅시다.refo
유저는 다른 그룹에 속하므로 실행 불가할 것입니다.refo in ~ at rocky ➜ sudo chown root:root test.sh refo in ~ at rocky … ➜ ./test.sh zsh: permission denied: ./test.sh
+x
로 실행 권한을 주면 소유자, 그룹, 그 외 유저 모두 실행 가능한 권한이 추가되어 실행 가능합니다.refo in ~ at rocky ➜ sudo chmod +x ./test.sh refo in ~ at rocky ➜ ls -lh total 4.0K -rwxr-xr-x 1 root root 5 Jan 27 17:05 test.sh refo in ~ at rocky ➜ ./test.sh Sat Jan 27 05:09:00 PM KST 2024
링크
- 우리가 일반적으로 생각하는 바로가기 링크는 리눅스에서는 Symbolic Link로 만들 수 있습니다.
ln -s target linkname
명령으로 생성 가능합니다. - 다른 링크 종류로는 Hard Link가 있습니다.
refo in ~ at rocky
➜ ls -lh
total 4.0K
-rwxr-xr-x 1 refo refo 5 Jan 27 17:05 test.sh
refo in ~ at rocky
➜ ln test.sh hardlink
refo in ~ at rocky
➜ ln -s test.sh softlink
refo in ~ at rocky
➜ ls -ilh
total 12K
2293071 -rwxr-xr-x 2 refo refo 5 Jan 27 17:05 hardlink
2300505 lrwxrwxrwx 1 refo refo 7 Jan 27 17:15 softlink -> test.sh
2293071 -rwxr-xr-x 2 refo refo 5 Jan 27 17:05 test.sh
refo in ~ at rocky
➜ cat hardlink
date
refo in ~ at rocky
➜ cat softlink
date
하드 링크와 소프트 링크의 가장 큰 차이점은 실제 파일과의 관계입니다. 하드 링크는 같은 원본 파일을 가리킵니다. ls 시 크기도 동일하게 나오고 inode 번호도 동일합니다. 그리고 파일 위치가 변경되어도 동작합니다.
심볼릭 링크는 파일 포인터이므로 크기가 실제 파일과 다를 수 있습니다. 그리고 실제 타겟의 경로가
->
뒤에 나옴. 이 경로에 파일이 없으면 링크가 깨집니다.refo in ~ at rocky ➜ mv ./test.sh /tmp refo in ~ at rocky ➜ ls -ilh total 8.0K 2293071 -rwxr-xr-x 1 refo refo 5 Jan 27 17:05 hardlink 2300505 lrwxrwxrwx 1 refo refo 7 Jan 27 17:15 softlink -> test.sh refo in ~ at rocky ➜ ./hardlink Sat Jan 27 05:18:50 PM KST 2024 refo in ~ at rocky ➜ ./softlink zsh: no such file or directory: ./softlink
대상 파일이 다시 원래 경로에 위치한다면 심볼릭 링크도 다시 정상 동작합니다.
refo in ~ at rocky ➜ mv /tmp/test.sh . refo in ~ at rocky ➜ ls -ilh total 12K 2293071 -rwxr-xr-x 1 refo refo 5 Jan 27 17:05 hardlink 2300505 lrwxrwxrwx 1 refo refo 7 Jan 27 17:15 softlink -> test.sh 2300512 -rwxr-xr-x 1 refo refo 5 Jan 27 17:05 test.sh refo in ~ at rocky ➜ ./hardlink Sat Jan 27 05:19:16 PM KST 2024 refo in ~ at rocky ➜ ./softlink Sat Jan 27 05:19:18 PM KST 2024
Prerequisites: 이 글에서 언급되었으나 깊게 설명하지 않은 내용입니다.
- linux