La foret rouge
Published on

리눅스 사용자와 그룹

Authors
  • avatar
    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 ...: 마지막 변경 시각
  • 파일 이름

실습

  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