[개념]
파일 권한 및 관리 부분 추가 필요
Sticky bit란?
- 보통 /tmp 디렉토리처럼 여러 사용자가 파일을 생성, 삭제하는 곳에 사용됨
- 디렉토리에 Sticky bit가 설정되어 있으면, 해당 디렉토리 내 파일을 소유자, 디렉토리 소유자, 또는 root만 삭제/이름변경 가능
- 즉, 다른 사용자로부터 자신이 만든 파일을 보호할 수 있음
1. 명령어
|
bash
chmod +t 디렉토리명 # Sticky bit 설정 chmod -t 디렉토리명 # Sticky bit 해제
|
2. 권한 표시
디렉토리 권한을 ls -ld로 보면, 가장 끝에 t가 붙어 표시됩니다.
|
bash
drwxrwxrwt 10 root root 4096 Aug 7 09:15 /tmp
|
위에서 t는 sticky bit가 설정됐음을 의미합니다.
3. 숫자 권한 표현
- Sticky bit를 숫자로 표현할 때는 1000 자리에 해당
- 예시: chmod 1777 /data/tmp
(1: sticky, 7: owner rwx, 7: group rwx, 7: others rwx)
- 예시: chmod 1777 /data/tmp
4. 활용 예시
- /tmp와 같이 모든 사용자가 접근할 수 있는 디렉토리에서 보안 강화용으로 필수 적용
==
umask 022 → 777-022 → 디렉터리 755, 파일 644
==
리눅스(Linux)애는 chmod(권한 변경 명령어)를 통해 파일이나 디렉토리에 특수 권한을 부여할 수 있다.
리눅스에서 제공되는 권한은 총 3가지이며, Sticky Bit(1번), SetGID(2번), SetUID(4번)이 있다. chmod 명령어를 통해 특수권한을 부여하는 방법은 "chmod (구분번호)(권한번호)" 이다.
| SetUID (4) | 실행 파일 | 소유자(Owner) 권한으로 파일실행 | -rwsr-xr-x (Owner의 실행권한 위치에 s) |
chmod 4755 |
| SetGID (2) | 실행 파일 | 그룹(Group) 권한으로 실행 | -rwxr-sr-x (Group의 실행권한 위치에 s) |
chmod 2755 |
| 디렉터리 | 디렉터리 그룹(Group) 권한 파일에 상속 | |||
| Sticky Bit | 디렉터리 | 디렉터리 안의 파일은 소유자(Owner)와 디렉터리 소유자(Group), root만 삭제 가능 | drwxrwxrwt (Other의 실행권한 위치에 t) |
chmod 1777 |
setuid의 경우 서버 내 담당자별 계정으로 권한을 분리하였지만 실행권한은 필요한 경우 자주 사용되며(passwd도 setuid 설정), sticky bit의 경우 /tmp 경로에서 주로 사용된다.
setgid의 경우 여러가지 계정들을 동시에 관리할 때 사용할 수 있다. (하나의 서버를 여러 팀이 쪼개어 사용하는 경우 등) 리눅스의 특수권한을 잘 활용하면 여러사람이 하나의 서버를 사용하더라도 안전하게 사용가능할 수 있다.
문제
다음과 같은 내용의 test.sh 스크립트 파일을 만들었습니다.
#!/bin/bash
# 현재 사용자 이름 출력
echo "Hello, $(whoami)!"
# 오늘 날짜와 시간 출력
date
# 디렉토리 생성 및 파일 복사
mkdir /tmp/backup
cp /etc/passwd /tmp/backup/
echo "Backup complete!"
이 스크립트를 다음과 같이 실행했으나, Permission denied 에러가 발생하며 스크립트가 실행되지 않았습니다.
$ ./test.sh
-bash: ./test.sh: Permission denied
스크립트가 실행되지 않은 가장 주된 원인은 무엇인가요?
- 스크립트 파일의 경로가 잘못되었다.
- #!/bin/bash 셸 뱅(shebang)이 잘못 작성되었다.
- mkdir 명령어를 실행할 권한이 없었다.
- 스크립트 파일에 실행 권한이 부여되지 않았다.
- cp 명령어를 실행할 권한이 없었다.
정답 및 해설
정답: 4. 스크립트 파일에 실행 권한이 부여되지 않았다.
Permission denied 에러 메시지는 파일에 접근하거나 실행할 권한이 없다는 것을 명확하게 나타냅니다. 스크립트를 실행하기 위해서는 해당 파일에 **실행 권한(execute permission)**이 반드시 있어야 합니다.
상세 해설
- 1. 스크립트 파일의 경로가 잘못되었다.
- 경로가 잘못되었다면 No such file or directory와 같은 에러가 발생합니다. Permission denied 에러는 파일이 존재하지만 권한 문제가 있을 때 나타납니다.
- 2. #!/bin/bash 셸 뱅(shebang)이 잘못 작성되었다.
- 셸 뱅이 잘못되었더라도 스크립트 자체의 실행 권한이 있다면, 스크립트가 실행되려다 구문 오류가 발생하거나 다른 오류가 나타납니다. 이 문제의 경우는 실행 시도 자체에서 권한 문제가 발생했습니다.
- 3. mkdir 명령어를 실행할 권한이 없었다.
- 스크립트 내부의 명령어(예: mkdir)가 권한 문제로 실패했다면, 스크립트는 일단 실행된 후에 해당 명령어가 있는 줄에서 에러를 뱉어냅니다. 이 문제의 경우는 스크립트 실행 자체에 실패했습니다.
- 5. cp 명령어를 실행할 권한이 없었다.
- mkdir와 마찬가지로 cp 명령어의 권한 문제였다면, 스크립트가 실행된 후에 오류가 발생합니다.
해결 방법:
chmod 명령어를 사용하여 test.sh 파일에 실행 권한을 부여하면 문제를 해결할 수 있습니다.
$ chmod +x test.sh
$ ./test.sh
Hello, your_username!
(현재 날짜와 시간)
Backup complete!
문제 1: 스크립트 실행 오류 분석
다음과 같은 내용의 cleanup.sh 스크립트가 있습니다.
#!/bin/bash
LOG_DIR="/var/log"
BACKUP_DIR="/tmp/backup_$(date +%Y%m%d)"
if [ ! -d "$LOG_DIR" ]; then
echo "Error: $LOG_DIR does not exist."
exit 1
fi
mkdir -p "$BACKUP_DIR"
cp $LOG_DIR/*.log "$BACKUP_DIR/"
echo "Log files backed up to $BACKUP_DIR"
이 스크립트를 일반 사용자(root가 아닌)로 실행했을 때, 다음 두 가지 상황 중 어떤 오류가 발생할 가능성이 가장 높으며, 그 이유는 무엇인가요?
- mkdir: cannot create directory '/tmp/backup_...' : Permission denied
- cp: cannot open '/var/log/*.log' for reading: Permission denied
정답:
2. cp: cannot open '/var/log/*.log' for reading: Permission denied
해설:
- 일반 사용자는 /var/log 디렉터리에 있는 로그 파일들을 읽을 권한이 없습니다. 이 디렉터리는 시스템의 중요한 로그를 담고 있으므로, 일반적으로 root 또는 특정 그룹에 속한 사용자만 접근할 수 있도록 설정되어 있습니다. 따라서 cp 명령어가 파일에 접근할 때 Permission denied 오류가 발생합니다.
- 반면, /tmp 디렉터리는 모든 사용자가 파일을 생성할 수 있도록 설정된 임시 디렉터리입니다. 따라서 mkdir -p "/tmp/backup_..." 명령어는 일반 사용자도 성공적으로 실행될 가능성이 높습니다. 이 스크립트의 가장 치명적인 오류는 cp 명령어에서 발생합니다.
'기타' 카테고리의 다른 글
| 06. FG BG nohup & (0) | 2025.08.28 |
|---|---|
| 05. 파일 복사 / 이동 (0) | 2025.08.28 |
| 03. 프로세스 (관리) (0) | 2025.08.28 |
| 02. shell과 환경변수 (2) | 2025.08.28 |
| 01. 계정/그룹 관리 (1) | 2025.08.28 |