vagrant
window terminal 설치
mkdir rapa
cd rapa
vagrant init
ls
ii .
생성된 Vagrantfile 열어서 아래 내용 붙여넣고 저장
# -*- mode: ruby -*-
# vi: set ft=ruby :
**vm_image = "nobreak-labs/rocky-9"
vm_subnet = "192.168.56."**
Vagrant.configure("2") do |config|
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.define "**user01**" do |node|
node.vm.box = vm_image
node.vm.provider "**virtualbox**" do |vb|
vb.name = "**user01**"
vb.cpus = 2
vb.memory = 2048
end
node.vm.network "private_network", **ip: vm_subnet + "11"**, nic_type: "virtio"
node.vm.hostname = "**user01**"
end
end
→ 사용자 이름 3개 동일하게(user01)
→ 가상머신 만들 때마다 사용자 이름 중복되지 않도록
vagrant up
→ 올리기 완료 후 virtualbox 에서 새 머신 생긴 거 확인 가능
$ **vagrant up**
Bringing machine 'user01' up with 'virtualbox' provider...
==> user01: Box 'nobreak-labs/rocky-9' could not be found. Attempting to find and install...
user01: Box Provider: virtualbox
user01: Box Version: >= 0
==> user01: Loading metadata for box 'nobreak-labs/rocky-9'
user01: URL: https://vagrantcloud.com/api/v2/vagrant/nobreak-labs/rocky-9
==> user01: Adding box 'nobreak-labs/rocky-9' (v9.5) for provider: virtualbox (amd64)
user01: Downloading: https://vagrantcloud.com/nobreak-labs/boxes/rocky-9/versions/9.5/providers/virtualbox/amd64/vagrant.box
user01:
user01: Calculating and comparing box checksum...
==> user01: Successfully added box 'nobreak-labs/rocky-9' (v9.5) for 'virtualbox (amd64)'!
==> user01: Importing base box 'nobreak-labs/rocky-9'...
==> user01: Matching MAC address for NAT networking...
==> user01: Checking if box 'nobreak-labs/rocky-9' version '9.5' is up to date...
==> user01: Setting the name of the VM: user01
==> user01: Clearing any previously set network interfaces...
==> user01: Preparing network interfaces based on configuration...
user01: Adapter 1: nat
user01: Adapter 2: hostonly
==> user01: Forwarding ports...
user01: 22 (guest) => 2222 (host) (adapter 1)
==> user01: Running 'pre-boot' VM customizations...
==> user01: Booting VM...
==> user01: Waiting for machine to boot. This may take a few minutes...
user01: SSH address: 127.0.0.1:2222
user01: SSH username: vagrant
user01: SSH auth method: private key
user01:
user01: Vagrant insecure key detected. Vagrant will automatically replace
user01: this with a newly generated keypair for better security.
user01:
user01: Inserting generated public key within guest...
user01: Removing insecure key from the guest if it's present...
user01: Key inserted! Disconnecting and reconnecting using new SSH key...
==> user01: Machine booted and ready!
==> user01: Checking for guest additions in VM...
user01: No guest additions were detected on the base box for this VM! Guest
user01: additions are required for forwarded ports, shared folders, host only
user01: networking, and more. If SSH fails on this machine, please install
user01: the guest additions and repackage the box to continue.
user01:
user01: This is not an error message; everything may continue to work properly,
user01: in which case you may ignore this message.
==> user01: Setting hostname...
==> user01: Configuring and enabling network interfaces...
vagrant status
→ running 중인 거 확인 가능
vagrant ssh
→ 만들어진 서버에 접속 가능
: 다중 사용자 시스템
: 하나의 컴퓨터를 여러 사용자가 사용할 수 있다
→ 여러 사용자가 함께 사용함으로써 발생할 수 있는 여러가지 문제를 해결하기 위한 부분이 잘 설계되어있음
사용자
: 리눅스 시스템에 접근할 수 있는 계정
UID
: 시스템에서 사용자를 인식하는 고유식별자
UID 가 같으면 시스템은 같은 사용자로 인식함
$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# vagrant UID 와 동일하게 test11 사용자 생성
[vagrant@user01 ~]$ sudo useradd -u 1000 -o test11
[vagrant@user01 ~]$ id test11
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
# vagrant 사용자의 권한으로 파일 생성
[vagrant@user01 ~]$ touch vagrant-file
[vagrant@user01 ~]$ ls -l vagrant-file
-rw-r--r--. 1 vagrant vagrant 0 Aug 25 02:06 vagrant-file
# test11 계정으로 로그인
[vagrant@user01 ~]$ sudo su - test11
Last login: Mon Aug 25 01:30:32 UTC 2025 from 10.0.2.2 on pts/0
# 여전히 vagrant 사용자 이름이 떠있음
[vagrant@user01 ~]$ id
uid=1000(vagrant) gid=1001(test11) groups=1001(test11) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[vagrant@user01 ~]$ whoami
vagrant
[vagrant@user01 ~]$ echo $USER
vagrant
[vagrant@user01 ~]$ echo $HOME
/home/test11
[vagrant@user01 ~]$ pwd
/home/test11
→ 시스템은 UID 가 같은 vagrant 와 test11 을 구분하지 못함
→ 즉, vagrant 만 접근 가능한 파일을 test11 또한 접근 가능
→ vagrant-file 은 vagrant 사용자에게만 수정 권한이 있었지만 test11 사용자도 수정 가능
시스템은 UID로 사용자를 식별한다!
: 하나의 사용자는 0개 혹은 여러개의 보조그룹을 가질 수 있음
: 해당 보조그룹이 공유하는 파일에 접근 권한을 가지게 됨
/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow # 요즘은 거의 쓰지 않음
/etc/passwd$ cat /etc/passwd
...
test11:**x**:1000:1001::/home/test11:/bin/bash
→ x: 비밀번호 placeholder, 사용자의 패스워드를 저장하는 필드
→ 예전엔 여기에 비밀번호가 적혀있었지만
→ /etc/shadow 에 저장됨
/etc/shadow# root 사용자만이 접근 가능
# 현재 user01 계정으로는 아무것도 권한이 없음
[vagrant@user01 ~]$ ls -l /etc/shadow
**----------**. 1 root root 948 Aug 25 02:05 /etc/shadow
[vagrant@user01 ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
$ sudo tail -n 2 /etc/shadow
vagrant:$6$K5FN/En70FxX2rlm$wUUOz2w5L1ZpLGrIAp4YNi8ycK.24dAONnI0sV1nzWkA9tZfSIsZu5yvlgpTx.[해시 값]/::0:99999:7:::
test11:!!:20325:0:99999:7:::
$6$K5FN/En70FxX2rlm$wUUOz2w5L1ZpLGrIAp4YNi8ycK.24dAONnI0sV1nzWkA9tZfSIsZu5yvlgpTx.WLOPBM7DdkGjjHhCL7hUHMi : 암호화된 패스워드$6
: 알고리즘 식별자
$K5FN/En70FxX2rlm
: 솔트(salt)
: 해시의 무작위성을 보장하는 문자열
: 보안 메커니즘
→ 솔트 한 번 치는건 의미없음
[해시 값]
: 해시 값
해시 ≠ 암호화
# 비밀번호 + 해시 알고리즘 + 솔트 = 해시 값
# 해시값 + 알고리즘 + 솔트 = 역산 불가능(복호화 불가능)
/etc/groupgroup password 존재는 하나 거의 사용x
$ cat /etc/group
root:x:0:
...
wheel:x:10:
...
wheel : 유닉스/리눅스에서 관리자(특권) 작업을 허용받은 사용자를 모아두는 전통적인 그룹 : 보통 wheel 그룹이 sudo 권한의 기준useradd# student1 사용자
# 홈디렉토리 /home/student1 지정
# 로그인 쉘 /bin/bash 지정
# 기본 그룹 users 지정
# 보조 그룹 wheel 지정
# GECOS 필드 "Student User" 설명 추가
# 사용자 아이디 1500 지정
$ sudo useradd -m -d /home/student1 -s /bin/bash -g users
-G wheel -c "Student User" -u 1500 student1
# 확인
$ tail -n 1 /etc/passwd
student1:x:1500:100:Student User:/home/student:/bin/bash
$ id student1
uid=1500(student1) gid=100(users) groups=100(users),10(wheel)
$ grep student /etc/passwd
student1:x:1500:100:Student User:/home/student:/bin/bash
$ sudo grep student1 /etc/shadow
student1:$6$rounds=100000$.dH..MPgigyxoTe1$chc/YQ.91GtRTCxiPN/lleBoQDqHdYOjk8I6rUO5QH8DLjLr35guyDQfkKdNONDq7EliedJSR8u.fMZshXht1.:20325:0:99999:7:::
$ grep student1 /etc/group
wheel:x:10:student1
useradd vs. adduser$ which useradd
/usr/sbin/useradd
$ which adduser
/usr/sbin/adduser
# adduser 의 심볼릭 링크: useradd
$ ls -l /usr/sbin/adduser
lrwxrwxrwx. 1 root root 7 Dec 17 2024 **/usr/sbin/adduser -> useradd**
$ ls -l /usr/sbin/useradd
-rwxr-xr-x. 1 root root 141328 Dec 17 2024 /usr/sbin/useradd
usermodusermod -aG
-aG : 보조그룹 추가-G : 보조그룹-a : append# 정상적으로 보조그룹 추가
$ sudo usermod -aG vagrant student1
$ id student1
uid=1500(student1) gid=100(users) groups=100(users),10(wheel),1000(vagrant)
$ sudo usermod -aG mail student1
$ id student1
uid=1500(student1) gid=100(users) groups=100(users),10(wheel),12(mail),1000(vagrant)
# a 를 빼먹으면?
$ sudo usermod -G sshd student1
# 보조그룹이 전부 덮어쓰기됨. 이전의 보조그룹이 다 날아감
$ id student1
uid=1500(student1) gid=100(users) groups=100(users),74(sshd)
사용자 잠금
# 계정 잠금
[vagrant@user01 ~]$ sudo usermod -L student1
# 로그인 시도 시 막힘
[vagrant@user01 ~]$ su - student1
Password:
su: Authentication failure
userdeluserdel 은 홈 디렉토리를 남김-r 옵션을 쓰면 홈 디렉토리까지 삭제 가능-r 옵션을 쓸 것./etc/skel[vagrant@user01 ~]$ echo 'echo "Welcome $USER!"' > /etc/skel/.bashrc
-bash: /etc/skel/.bashrc: Permission denied
[vagrant@user01 ~]$ sudo echo 'echo "Welcome $USER!"' > /etc/skel/.bashrc
-bash: /etc/skel/.bashrc: **Permission denied**
# echo 에 sudo 가 필요한게 아니라 /etc/skel 에 루트 권한이 필요한 것
# 그러나 말도 안되는 명령어
[vagrant@user01 ~]$ echo 'echo "Welcome $USER!"' > sudo /etc/skel/.bashrc
# permission denied 는 안났지만 추가되지 않았음을 확인 가능
[vagrant@user01 ~]$ sudo cat /etc/skel/.bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
if [ -d ~/.bashrc.d ]; then
for rc in ~/.bashrc.d/*; do
if [ -f "$rc" ]; then
. "$rc"
fi
done
fi
unset rc
[vagrant@user01 ~]$ **echo 'echo "Welcome $USER!"' | sudo tee -a /etc/skel/.ba
shrc**
echo "Welcome $USER!"
[vagrant@user01 ~]$ sudo touch /etc/skel/welcome.txt
[vagrant@user01 ~]$ sudo useradd student1
useradd: warning: the home directory /home/student1 already exists.
useradd: Not copying any file from skel directory into it.
[vagrant@user01 ~]$ sudo useradd student3
[vagrant@user01 ~]$ sudo su - student3
**Welcome student3!**
su vs su -# PATH = 명령어가 들어있는 경로?
[vagrant@user01 ~]$ echo $PATH
/home/vagrant/.local/bin:/home/vagrant/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
# 비번: vagrant
[vagrant@user01 ~]$ su
Password:
# 여전히 원래 사용자(vagrant)의 PATH 가 남아있음
# PATH 가 오염되어 있음
# : 을 기준으로 앞에 경로부터 돌면서 찾음.
# 없으면 그 다음 경로에서 찾는데, vagrant 에서 찾게되면 아주 큰 문제가 발생
[**root**@user01 vagrant]# echo $PATH
/root/.local/bin:/root/bin:/home/**vagrant**/.local/bin:/home/**vagrant**/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
[vagrant@user01 ~]$ su -
Password:
Last login: Mon Aug 25 05:36:50 UTC 2025 on pts/0
# root 의 PATH
[root@user01 ~]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
sudo: root 의 권한을 쓸 수 있게 해줌
: super do 의 약자
/etc/sudoers$ ls -l /etc/sudoers
-r--r-----. 1 root root 4328 Feb 14 2024 /etc/sudoers
# /etc/sudoers 파일을 수정할 때 직접 수정 xxx
# visudo 를 이용해야 최소한의 안전장치를 둘 수 있음
# error 를 검사하고 error 가 났을 때 해야 할 행동을 안내해줌
$ sudo visudo
/etc/sudoers:1:9: syntax error
dakfadaf## Sudoers allows particular users to run various commands as
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
What now? ?
Options are:
(e)dit sudoers file again
e(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)
What now? x
# student3 사용자에게 sudo 사용 권한 부여
[vagrant@user01 ~]$ sudo vi /etc/sudoers.d/student3
[vagrant@user01 ~]$ sudo cat /etc/sudoers.d/student3
student3 ALL=(ALL) NOPASSWD: ALL
# su 권한을 사용할 수 있게 됨
# student3 계정으로 로그인 후 root 계정으로 로그인 가능
[vagrant@user01 ~]$ sudo su - student3
Last login: Mon Aug 25 05:32:03 UTC 2025 on pts/0
Last failed login: Mon Aug 25 06:10:37 UTC 2025 on pts/0
There were 3 failed login attempts since the last successful login.
Welcome student3!
[student3@user01 ~]$ sudo su -
Last login: Mon Aug 25 05:38:41 UTC 2025 on pts/0
Last failed login: Mon Aug 25 05:41:53 UTC 2025 from ::1 on ssh:notty
There was 1 failed login attempt since the last successful login.
setuid: 다른 사용자의 신분으로 잠깐 변신
: 파일을 실행한 사용자가 아니라 파일을 소유한 사용자의 권한으로 프로세스가 실행됨
사용자는 자신의 비밀번호를 passwd 로 바꿀 수 있다
그러나 비밀번호가 없으면 바꿀 수 없다
[vagrant@user01 ~]$ ls -l /usr/bin/passwd
-rw**s**r-xr-x. 1 root root 32656 May 14 2022 /usr/bin/passwd
# s(setuid): root 사용자의 권한을 빌려서 실행
setgid: 다른 그룹의 신분으로 잠시 변신
: 디렉토리에 setgid 가 설정되어 있다면 해당 디렉토리에서 파일을 생성했을 때 파일의 사용자 그룹은 파일을 생성한 사용자의 기본 그룹으로 지정되지 않고, setgid 가 설정된 디렉토리의 사용자 그룹으로 상속됨
$ ls -ld /run/log/journal/
drwxr-**s**r-x+ 4 root **systemd-journal** 80 Aug 25 01:19 /run/log/journal/
# 기본그룹이 디폴트로 설정되지 않고, 상속받음
$ cd /run/log/journal/
$ sudo mkdir dirA
$ sudo touch fileA
$ ls -l
total 0
drwxr-s---+ 2 root systemd-journal 60 Aug 25 01:19 15fcb0dcac444ce38774f7be6ccff651
drwxr-sr-x+ 2 root **systemd-journal** 40 Aug 25 06:29 **dirA**
drwxr-s---+ 2 root systemd-journal 60 Aug 25 01:19 ed7122a721af4f4f8cd890e86b5579ce
-rw-r--r--+ 1 root **systemd-journal** 0 Aug 25 06:29 **fileA**
: 파일을 소유한 사용자만 파일을 삭제할 수 있도록 함
$ ls -ld /tmp /var/tmp
drwxrwxrwt. 6 root root 4096 Aug 25 06:11 /tmp
drwxrwxrwt. 6 root root 4096 Aug 25 06:11 /var/tmp
[vagrant@user01 ~]$ mkdir /tmp/testdir
[vagrant@user01 ~]$ chmod 777 /tmp/testdir
[vagrant@user01 ~]$ ls -ld /tmp/testdir
drwxrwxrwx. 2 vagrant vagrant 6 Aug 25 06:34 /tmp/testdir
[vagrant@user01 ~]$ sudo useradd user01
[vagrant@user01 ~]$ sudo useradd user02
[vagrant@user01 ~]$ sudo useradd user03
[vagrant@user01 ~]$ sudo passwd user01
Changing password for user user01.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[vagrant@user01 ~]$ sudo passwd user02
Changing password for user user02.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
# user01 이 파일 하나 생성
[vagrant@user01 ~]$ su - user01
Password:
Welcome user01!
[user01@user01 ~]$ touch /tmp/testdir/fileA
[user01@user01 ~]$ ls -l /tmp/testdir/fileA
-rw-r--r--. 1 user01 user01 0 Aug 25 06:36 /tmp/testdir/fileA
# user02 가 해당 파일 삭제
[user01@user01 ~]$ su - user02
Password:
Welcome user02!
[user02@user01 ~]$ rm /tmp/testdir/fileA
rm: remove write-protected regular empty file '/tmp/testdir/fileA'? y
[user02@user01 ~]$ ls -l /tmp/testdir/fileA
ls: cannot access '/tmp/testdir/fileA': No such file or directory
# 원래 sticky bit 존재 x
[vagrant@user01 ~]$ ls -ld /tmp/testdir
drwxrwxrwx. 2 vagrant vagrant 6 Aug 25 06:37 /tmp/testdir
# sticky bit 설정
[vagrant@user01 ~]$ chmod +t /tmp/testdir
[vagrant@user01 ~]$ ls -ld /tmp/testdir
drwxrwxrw**t**. 2 vagrant vagrant 6 Aug 25 06:37 /tmp/testdir
# 이젠 user01 이 만든 파일 user02 가 삭제 불가능
[user01@user01 ~]$ touch /tmp/testdir/fileA
[user01@user01 ~]$ exit
logout
[vagrant@user01 ~]$ exit
logout
[user02@user01 ~]$
[user02@user01 ~]$ whoami
user02
[user02@user01 ~]$ rm /tmp/testdir/fileA
rm: remove write-protected regular empty file '/tmp/testdir/fileA'? y
rm: cannot remove '/tmp/testdir/fileA': Operation not permitted
: 각 파일과 디렉토리에 대해 사용자마다 다른 접근 권한을 부여하기 위한 확장 권한 시스템
최신 리눅스 vs. 옛날 리눅스 기준
: CentOS7, RHEL7
init vs. systemd
←—————-→
[vagrant@user01 ~]$ sudo su -
Last login: Mon Aug 25 06:11:15 UTC 2025 on pts/0
[root@user01 ~]# mkdir -p acl/files
[root@user01 ~]# touch acl/files/file1.txt
[root@user01 ~]# touch acl/files/file2.txt
[root@user01 ~]# echo "test" > acl/files/file1.txt
[root@user01 ~]# tail -n 3 /etc/passwd
user01:x:1004:1005::/home/user01:/bin/bash
user02:x:1005:1006::/home/user02:/bin/bash
user03:x:1006:1007::/home/user03:/bin/bash
# . 이므로 acl 적용 x
[root@user01 ~]# ls -l acl/files/file1.txt
-rw-r--r--. 1 root root 5 Aug 25 07:10 acl/files/file1.txt
# acl 적용(user02 에게 rw 권한 부여)
[root@user01 ~]# **setfacl** -m **u:user01:rw** acl/files/file1.txt
# acl 적용됐음을 . 대신 + 로 확인 가능
[root@user01 ~]# ls -l acl/files/file1.txt
-rw-rw-r--**+** 1 root root 5 Aug 25 07:10 acl/files/file1.txt
# 해당 파일의 acl 정보 가져오기
[root@user01 ~]# **getfacl** acl/files/file1.txt
# file: acl/files/file1.txt
# owner: root
# group: root
user::rw-
**user:user01:rw- # user01 사용자에게만 특별히 부여된 권한(setfacl)**
group::r--
mask::rw-
other::r--
-m : mask. 마스크: 최대 권한을 제한
[root@user01 ~]# touch acl/files/mask_test.txt
[root@user01 ~]# setfacl -m u:user01:rwx,u:user02:rw,u:user03:r acl/files/mask_test.txt
[root@user01 ~]# getfacl acl/files/mask_test.txt
# file: acl/files/mask_test.txt
# owner: root
# group: root
user::rw-
user:user01:rwx
user:user02:rw-
user:user03:r--
group::r--
mask::rwx
other::r--
# 마스크로 최대 권한 설정
# r 로 권한 제한됨(마스크와 and 연산을 진행해서 남은 권한으로 제한)
[root@user01 ~]# setfacl **-m m::r** acl/files/mask_test.txt
[root@user01 ~]# getfacl acl/files/mask_test.txt
# file: acl/files/mask_test.txt
# owner: root
# group: root
user::rw-
user:user01:rwx **#effective:r--**
user:user02:rw- **#effective:r--**
user:user03:r--
group::r--
**mask::r--**
other::r--