La foret rouge

리눅스 사용자와 그룹

Published on
Published on

리눅스는 다중 사용자 시스템입니다. 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 ...: 마지막 변경 시각
  • 파일 이름

실습

  1. 파일을 생성하고 권한을 확인해 봅니다.

    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
    
  2. 실행 권한이 없는 파일은 실행할 수 없습니다.

    refo in ~ at rocky
    ➜ ./test.sh
    zsh: permission denied: ./test.sh
    
  3. 현재 유저에게만 실행 권한을 주고 실행해 봅시다.

    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
    
  4. root 유저, 그룹으로 바꿔보고 실행해 봅시다. refo 유저는 다른 그룹에 속하므로 실행 불가할 것입니다.

    refo in ~ at rocky
    sudo chown root:root test.sh
    
    refo in ~ at rocky …
    ➜ ./test.sh
    zsh: permission denied: ./test.sh
    
  5. +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