Alert

이 글은 Claude Code의 도움을 λ°›μ•„ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€

TL;DR

  1. κΆŒν•œμ˜ κΈ°λ³Έ ꡬ쑰 β€” λˆ„κ°€, 무엇을
  2. 숫자 ν‘œκΈ°λ²•
  3. ls -l 좜λ ₯ 읽기
  4. chmod β€” κΆŒν•œ λ³€κ²½
  5. chown / chgrp β€” μ†Œμœ μž λ³€κ²½
  6. 자주 μ“°λŠ” κΆŒν•œ μ‘°ν•©
  7. 디렉토리 κΆŒν•œμ˜ 차이
  8. umask β€” κΈ°λ³Έ κΆŒν•œ μ„€μ •
  9. 특수 λΉ„νŠΈ β€” setuid, setgid, sticky

κΆŒν•œμ˜ κΈ°λ³Έ ꡬ쑰 β€” λˆ„κ°€, 무엇을

β€λˆ„κ°€β€ β€” μ„Έ λΆ€λ₯˜μ˜ μ‚¬μš©μž
  • Owner (u) : νŒŒμΌμ„ λ§Œλ“  μ†Œμœ μž
  • Group (g) : μ†Œμœ μžκ°€ μ†ν•œ 그룹의 μ‚¬μš©μžλ“€
  • Other (o) : κ·Έ μ™Έ λͺ¨λ“  μ‚¬μš©μž
”무엇을” β€” μ„Έ κ°€μ§€ κΆŒν•œ
κΆŒν•œκΈ°ν˜Έμˆ«μžνŒŒμΌμ—μ„œμ˜ 의미
읽기r4파일 λ‚΄μš©μ„ λ³Ό 수 있음
μ“°κΈ°w2파일 λ‚΄μš©μ„ μˆ˜μ •ν•  수 있음
μ‹€ν–‰x1νŒŒμΌμ„ ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ‹€ν–‰ν•  수 있음
  • μ„Έ κΆŒν•œμ˜ 숫자λ₯Ό λ”ν•΄μ„œ 쑰합을 ν‘œν˜„
    • r + w = 4 + 2 = 6 β†’ 읽기+μ“°κΈ°
    • r + w + x = 4 + 2 + 1 = 7 β†’ μ „λΆ€ ν—ˆμš©
    • 아무 κΆŒν•œ μ—†μŒ = 0

숫자 ν‘œκΈ°λ²•

0~7 숫자-κΆŒν•œ λ§€ν•‘
μˆ«μžκΈ°ν˜ΈκΆŒν•œ
0---μ—†μŒ
1--xμ‹€ν–‰λ§Œ
2-w-μ“°κΈ°λ§Œ
3-wxμ“°κΈ°+μ‹€ν–‰
4r--읽기만
5r-x읽기+μ‹€ν–‰
6rw-읽기+μ“°κΈ°
7rwxμ „λΆ€
μ„Έ 자리 μ‘°ν•© β€” Owner / Group / Other μˆœμ„œ
숫자 해석법
  7    5    5
 rwx  r-x  r-x
  β”‚    β”‚    └── Other : 읽기+μ‹€ν–‰
  β”‚    └─────── Group : 읽기+μ‹€ν–‰
  └──────────── Owner : μ „λΆ€

ls -l 좜λ ₯ 읽기

파일 λͺ©λ‘ 상세 보기
ls -l
# -rw-r--r--  1 argus  staff  4096  Apr  6 14:30 config.yaml
# drwxr-xr-x  3 argus  staff    96  Apr  6 14:30 scripts/
각 ν•„λ“œ 해석
-  rw-  r--  r--   1   argus  staff  4096  Apr 6 14:30  config.yaml
β”‚  β”‚    β”‚    β”‚     β”‚     β”‚      β”‚     β”‚          β”‚          β”‚
β”‚  β”‚    β”‚    β”‚     β”‚     β”‚      β”‚     β”‚          β”‚          β”” 파일λͺ…
β”‚  β”‚    β”‚    β”‚     β”‚     β”‚      β”‚     β”‚          β”” μˆ˜μ • μ‹œκ°„
β”‚  β”‚    β”‚    β”‚     β”‚     β”‚      β”‚     β”” 파일 크기 (bytes)
β”‚  β”‚    β”‚    β”‚     β”‚     β”‚      β”” μ†Œμœ  κ·Έλ£Ή
β”‚  β”‚    β”‚    β”‚     β”‚     β”” μ†Œμœ μž
β”‚  β”‚    β”‚    β”‚     β”” ν•˜λ“œλ§ν¬ 수
β”‚  β”‚    β”‚    β”” Other κΆŒν•œ
β”‚  β”‚    β”” Group κΆŒν•œ
β”‚  β”” Owner κΆŒν•œ
β”” 파일 νƒ€μž… (- : 파일, d : 디렉토리, l : 심볼릭 링크)

chmod β€” κΆŒν•œ λ³€κ²½

숫자 방식
chmod 숫자 방식
chmod 755 script.sh       # rwxr-xr-x β€” μ‹€ν–‰ κ°€λŠ₯ν•œ 슀크립트
chmod 644 config.yaml     # rw-r--r-- β€” 일반 μ„€μ • 파일
chmod 600 id_rsa          # rw------- β€” SSH κ°œμΈν‚€ (μ†Œμœ μžλ§Œ)
chmod 777 tmp_dir         # rwxrwxrwx β€” λͺ¨λ‘ ν—ˆμš© (λ³΄μ•ˆ 주의)
기호 방식
chmod 기호 방식
# u=μ†Œμœ μž, g=κ·Έλ£Ή, o=기타, a=전체
chmod u+x script.sh       # μ†Œμœ μžμ— μ‹€ν–‰ κΆŒν•œ μΆ”κ°€
chmod g-w config.yaml     # κ·Έλ£Ήμ—μ„œ μ“°κΈ° κΆŒν•œ 제거
chmod o=r file.txt        # 기타 μ‚¬μš©μžλ₯Ό 읽기만으둜 μ„€μ •
chmod a+r public.html     # λͺ¨λ“  μ‚¬μš©μžμ— 읽기 μΆ”κ°€
chmod u=rwx,g=rx,o=rx script.sh   # 755와 동일
μž¬κ·€ 적용
ν•˜μœ„ 파일/폴더 전체에 적용
# 디렉토리 전체에 μž¬κ·€ 적용
chmod -R 755 ./deploy/
 
# 파일과 디렉토리λ₯Ό κ΅¬λΆ„ν•΄μ„œ μ μš©ν•˜κ³  싢을 λ•Œ
find ./project -type f -exec chmod 644 {} \;   # 파일만 644
find ./project -type d -exec chmod 755 {} \;   # λ””λ ‰ν† λ¦¬λ§Œ 755

숫자 vs 기호 β€” μ–Έμ œ μ“°λŠ”κ°€

  • 숫자 : κΆŒν•œμ„ μ²˜μŒλΆ€ν„° ν™•μ‹€ν•˜κ²Œ μ§€μ •ν•  λ•Œ (chmod 755)
  • 기호 : κΈ°μ‘΄ κΆŒν•œμ—μ„œ μΌλΆ€λ§Œ μΆ”κ°€/μ œκ±°ν•  λ•Œ (chmod u+x)

chown / chgrp β€” μ†Œμœ μžΒ·κ·Έλ£Ή λ³€κ²½

  • κΆŒν•œ(permission)κ³Ό μ†Œμœ μž(ownership)λŠ” λ³„κ°œ β€” λ‘˜ λ‹€ λ§žμ•„μ•Ό μ ‘κ·Ό κ°€λŠ₯
μ†Œμœ μž/κ·Έλ£Ή λ³€κ²½
# μ†Œμœ μž λ³€κ²½
chown newuser file.txt
 
# μ†Œμœ μž + κ·Έλ£Ή λ™μ‹œ λ³€κ²½
chown newuser:newgroup file.txt
 
# 그룹만 λ³€κ²½
chgrp deploy file.txt
 
# μž¬κ·€ 적용
chown -R appuser:appgroup ./data/
싀무 μ˜ˆμ‹œ
# μ›Ή μ„œλ²„κ°€ 읽을 수 μžˆλ„λ‘ μ†Œμœ μž λ³€κ²½
sudo chown -R www-data:www-data /var/www/html/
 
# 배포 디렉토리λ₯Ό deploy κ·Έλ£Ή μ†Œμœ λ‘œ
sudo chown -R root:deploy /opt/app/
sudo chmod -R 775 /opt/app/

자주 μ“°λŠ” κΆŒν•œ μ‘°ν•©

κΆŒν•œκΈ°ν˜Έμš©λ„μ‹€λ¬΄ μ˜ˆμ‹œ
644rw-r--r--일반 파일 κΈ°λ³Έκ°’μ„€μ • 파일, HTML, μ†ŒμŠ€ μ½”λ“œ
600rw-------λ―Όκ°ν•œ 파일SSH ν‚€(~/.ssh/id_rsa), .env
755rwxr-xr-xμ‹€ν–‰ νŒŒμΌΒ·λ””λ ‰ν† λ¦¬ κΈ°λ³Έκ°’μ‰˜ 슀크립트, 곡개 디렉토리
700rwx------개인 μ „μš©~/.ssh/ 디렉토리, 개인 슀크립트
775rwxrwxr-xκ·Έλ£Ή κ³΅μœ νŒ€ 배포 디렉토리
777rwxrwxrwxλͺ¨λ‘ ν—ˆμš©/tmp 정도. 일반적으둜 μ‚¬μš© κΈˆμ§€
400r--------읽기 μ „μš© (μ†Œμœ μžλ§Œ)μΈμ¦μ„œ, λ°±μ—…λœ ν‚€ 파일

SSH ν‚€ κΆŒν•œμ΄ λ§žμ§€ μ•ŠμœΌλ©΄ 접속 μžμ²΄κ°€ 거뢀됨

# SSHκ°€ ν‚€ 파일 κΆŒν•œμ΄ λ„ˆλ¬΄ μ—΄λ €μžˆμœΌλ©΄ μ‚¬μš©μ„ κ±°λΆ€
# Permissions 0644 for 'id_rsa' are too open. β†’ 접속 μ‹€νŒ¨
chmod 600 ~/.ssh/id_rsa         # κ°œμΈν‚€
chmod 644 ~/.ssh/id_rsa.pub     # κ³΅κ°œν‚€
chmod 700 ~/.ssh                # .ssh 디렉토리

디렉토리 κΆŒν•œμ˜ 차이

  • 파일과 λ””λ ‰ν† λ¦¬μ—μ„œ r, w, x의 μ˜λ―Έκ°€ 닀름
κΆŒν•œνŒŒμΌλ””λ ‰ν† λ¦¬
rλ‚΄μš© 읽기 (cat)λͺ©λ‘ 보기 (ls)
wλ‚΄μš© μˆ˜μ •νŒŒμΌ 생성/μ‚­μ œ/이름 λ³€κ²½
xμ‹€ν–‰μ§„μž… (cd)
디렉토리 κΆŒν•œ μ‹€ν—˜
# x 없이 r만 μžˆλŠ” 디렉토리
chmod 744 mydir/     # rwxr--r--
ls mydir/            # βœ… λͺ©λ‘μ€ λ³΄μž„ (r)
cat mydir/file.txt   # ❌ μ§„μž… λΆˆκ°€ (x μ—†μŒ)
cd mydir/            # ❌ μ§„μž… λΆˆκ°€
 
# r 없이 x만 μžˆλŠ” 디렉토리
chmod 711 mydir/     # rwx--x--x
ls mydir/            # ❌ λͺ©λ‘ λͺ» λ΄„ (r μ—†μŒ)
cat mydir/file.txt   # βœ… 경둜λ₯Ό μ•Œλ©΄ μ ‘κ·Ό κ°€λŠ₯ (x 있음)
cd mydir/            # βœ… μ§„μž… κ°€λŠ₯
  • λ””λ ‰ν† λ¦¬μ—μ„œ xλŠ” β€œν†΅κ³Ό κ°€λŠ₯” κΆŒν•œ β€” μ—†μœΌλ©΄ μ•ˆμ— 파일이 μžˆμ–΄λ„ μ ‘κ·Ό λΆˆκ°€
  • λ””λ ‰ν† λ¦¬μ—λŠ” 보톡 rκ³Ό xλ₯Ό ν•¨κ»˜ λΆ€μ—¬ (5 λ˜λŠ” 7)

umask β€” 파일 생성 μ‹œ κΈ°λ³Έ κΆŒν•œ

κ°œλ…
  • μƒˆ 파일/디렉토리λ₯Ό λ§Œλ“€ λ•Œ μžλ™μœΌλ‘œ μ μš©λ˜λŠ” κΆŒν•œμ„ κ²°μ •
  • β€œλ§ˆμŠ€ν¬β€λΌλŠ” μ΄λ¦„μ²˜λŸΌ 전체 κΆŒν•œμ—μ„œ λΉΌλŠ”(μ°¨λ‹¨ν•˜λŠ”) κ°’
λ™μž‘ 원리
umask 계산
파일 κΈ°λ³Έ μ΅œλŒ€ κΆŒν•œ    : 666 (μ‹€ν–‰ κΆŒν•œ μ—†μŒ)
디렉토리 κΈ°λ³Έ μ΅œλŒ€ κΆŒν•œ : 777
 
umask κ°’              : 022
 
μƒˆ 파일 κΆŒν•œ    = 666 - 022 = 644 (rw-r--r--)
μƒˆ 디렉토리 κΆŒν•œ = 777 - 022 = 755 (rwxr-xr-x)
umask 확인 및 λ³€κ²½
# ν˜„μž¬ umask 확인
umask
# 022
 
# 기호 ν˜•νƒœλ‘œ 확인
umask -S
# u=rwx,g=rx,o=rx
 
# umask λ³€κ²½ (ν˜„μž¬ μ„Έμ…˜)
umask 077     # μƒˆ 파일 600, μƒˆ 디렉토리 700 β†’ μ†Œμœ μžλ§Œ μ ‘κ·Ό
 
# 영ꡬ μ μš©ν•˜λ €λ©΄ ~/.bashrc λ˜λŠ” ~/.zshrc에 μΆ”κ°€
echo "umask 022" >> ~/.zshrc
자주 μ“°λŠ” umask κ°’
umaskμƒˆ νŒŒμΌμƒˆ λ””λ ‰ν† λ¦¬μš©λ„
022644755일반적인 κΈ°λ³Έκ°’
027640750κ·Έλ£ΉκΉŒμ§€λ§Œ 읽기 ν—ˆμš©
077600700μ†Œμœ μžλ§Œ μ ‘κ·Ό (λ³΄μ•ˆ κ°•ν™”)

특수 λΉ„νŠΈ β€” setuid, setgid, sticky

  • 일반 κΆŒν•œ(3자리) μ•žμ— λ„€ 번째 자리둜 ν‘œν˜„
  • μΌμƒμ μœΌλ‘œ 자주 μ„€μ •ν•˜μ§„ μ•Šμ§€λ§Œ, μ‹œμŠ€ν…œ νŒŒμΌμ—μ„œ 보게 됨
setuid (4) β€” μ‹€ν–‰ μ‹œ 파일 μ†Œμœ μž κΆŒν•œμœΌλ‘œ λ™μž‘
setuid μ˜ˆμ‹œ
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
#    ^
#    s = setuidκ°€ μ„€μ •λ˜μ–΄ 있음
  • passwd λͺ…령은 일반 μ‚¬μš©μžκ°€ 싀행해도 root κΆŒν•œμœΌλ‘œ /etc/shadowλ₯Ό μˆ˜μ •ν•  수 있음
  • μ†Œμœ μžμ˜ x μžλ¦¬μ— s둜 ν‘œμ‹œλ¨
chmod 4755 special_binary    # setuid μ„€μ •
chmod u+s special_binary     # 기호 방식
setgid (2) β€” μ‹€ν–‰ μ‹œ 파일 κ·Έλ£Ή κΆŒν•œμœΌλ‘œ λ™μž‘ / λ””λ ‰ν† λ¦¬μ—μ„œλŠ” κ·Έλ£Ή 상속
setgid 디렉토리 β€” νŒ€ 곡유 폴더에 유용
# setgidκ°€ μ„€μ •λœ λ””λ ‰ν† λ¦¬μ—μ„œ μƒμ„±ν•œ νŒŒμΌμ€ λ””λ ‰ν† λ¦¬μ˜ 그룹을 상속
mkdir /shared
chgrp team /shared
chmod 2775 /shared
 
# λˆ„κ°€ λ§Œλ“€λ“  그룹이 team으둜 섀정됨
touch /shared/report.txt
ls -l /shared/report.txt
# -rw-rw-r-- 1 argus team ... report.txt
sticky bit (1) β€” 자기 파일만 μ‚­μ œ κ°€λŠ₯
sticky bit μ˜ˆμ‹œ
ls -ld /tmp
# drwxrwxrwt 15 root root ... /tmp
#          ^
#          t = sticky bit
 
# /tmpλŠ” λˆ„κ΅¬λ‚˜ νŒŒμΌμ„ λ§Œλ“€ 수 μžˆμ§€λ§Œ (777)
# λ‹€λ₯Έ μ‚¬μš©μžμ˜ νŒŒμΌμ„ μ‚­μ œν•  μˆ˜λŠ” μ—†μŒ (sticky)
chmod 1777 /shared_tmp    # sticky bit μ„€μ •
chmod +t /shared_tmp      # 기호 방식
특수 λΉ„νŠΈ μš”μ•½
λΉ„νŠΈμˆ«μžκΈ°ν˜Έ ν‘œμ‹œλŒ€μƒνš¨κ³Ό
setuid4s (owner x 자리)μ‹€ν–‰ νŒŒμΌμ†Œμœ μž κΆŒν•œμœΌλ‘œ μ‹€ν–‰
setgid2s (group x 자리)μ‹€ν–‰ 파일/디렉토리그룹 κΆŒν•œμœΌλ‘œ μ‹€ν–‰ / κ·Έλ£Ή 상속
sticky1t (other x 자리)λ””λ ‰ν† λ¦¬μžκΈ° 파일만 μ‚­μ œ κ°€λŠ₯