파일 권한과 기본 권한
권한 문자열 읽기, 파일과 디렉터리의 rwx 차이, 기호, 숫자 방식 chmod, 보안 점검과 표준 권한 맞추기, umask와 야간 백업 스크립트 장애 진단
#핵심 요약
ls -l의 맨 앞 10자리는 종류 1자리와 소유자, 그룹, 기타 사용자 권한 3자리씩임
파일의 x는 실행, 디렉터리의 x는 들어가서 안의 파일에 접근하는 권한이라 디렉터리에 x가 없으면 파일 권한이 맞아도 읽지 못함
chmod u+x처럼 기호 방식은 필요한 권한만 더하거나 빼고, chmod 640처럼 숫자 방식은 전체를 정확히 고정함
새 파일의 기본 권한은 umask로 정해지며 Oracle 실무에는 027(파일 640, 디렉터리 750)이 자주 권장됨
#개념과 동작 원리
| 자리 | 파일에서 | 디렉터리에서 |
|---|---|---|
r (4) |
내용 읽기 | 안의 이름 목록 보기 |
w (2) |
내용 고치기 | 안에 만들기, 지우기, 이름 바꾸기 |
x (1) |
실행 | 들어가기(cd), 안의 파일에 접근 |
| umask | 새 파일 | 새 디렉터리 | 성격 |
|---|---|---|---|
0002 |
664 rw-rw-r-- |
775 | 그룹 공동 작업 |
0022 |
644 rw-r--r-- |
755 | 일반적인 서버 표준 |
0027 |
640 rw-r----- |
750 | Oracle 실무 권장 |
0077 |
600 rw------- |
700 | 개인 전용 |
새 파일은 666, 새 디렉터리는 777에서 umask 자리를 빼서 정해지므로 umask로는 파일에 실행 권한이 붙지 않음
파일 소유자, 그룹 변경은 OS 사용자와 소유권에서 다룸
#필수 명령어 또는 SQL
#실행이 거부될 때 (소유자 x 추가)
./script/rman_full.sh
ls -l script/rman_full.sh
chmod u+x script/rman_full.sh
./script/rman_full.sh결과 해석:
-rw-r--r--(644)는 소유자에게 x가 없어 Permission denied가 남u+x로 소유자 실행 권한만 더하면 다른 권한은 그대로임
chmod +x처럼 대상을 빼면 소유자, 그룹, 기타 모두에 x가 붙으므로 필요한 대상만 지정함
#파일은 멀쩡한데 읽지 못할 때 (디렉터리 x)
cat secure/note.txt
ls -ld secure
chmod u+x secure
cat secure/note.txt결과 해석:
secure 디렉터리에서 소유자 x를 뺀 상태라 cat과 cd가 모두 거부됨
디렉터리에 r만 있으면 이름 목록은 보여도 안의 파일을 열 수 없음
디렉터리를 확인할 때는 안의 목록이 아니라 디렉터리 자체를 보는 ls -ld를 씀
#보안 점검과 표준 권한 맞추기
find migrate -type f -perm /o=rwx -printf "%M %p\n"
find migrate -type d -exec chmod -c 750 {} \;
ls migrate/conf/*.ora
chmod -c 640 migrate/conf/*.ora
chmod -c 750 migrate/bin/*.sh
find migrate -type f -perm /o=rwx -printf "%M %p\n"결과 해석:
-perm /o=rwx는 기타 사용자에게 r, w, x 중 하나라도 있는 파일을 찾음
준비 상태에서는 arch_purge.sh, listener.ora, sqlnet.ora가 모두 -rwxrwxrwx로 적발됨
chmod -R 750 migrate처럼 한 번에 바꾸면 설정 파일에도 실행 권한이 붙으므로, 디렉터리 750, .ora 640, .sh 750으로 나눠 맞춤
-c는 실제로 바뀐 항목만 출력하고 -v는 바뀌지 않은 것까지 모두 출력함
마지막에 같은 find로 적발 건수가 0인지 다시 확인함
수업 자료에는 이 과제의 정답이 없어 위 명령은 문제의 힌트(find -type d, -exec, 변경분 출력 옵션)에 맞춘 것임
#기준 파일 따라 하기와 정확히 고정하기
ls -l netconf
chmod --reference=netconf/listener.ora netconf/tnsnames.ora
chmod u=rw,g=r,o= netconf/passwd_memo.txt
ls -l netconf결과 해석:
--reference는 권한 숫자를 계산하지 않고 기준 파일(listener.ora, rw-r-----)과 같게 맞춤
u=rw,g=r,o=는 지금 권한과 관계없이 rw-r-----로 정확히 고정하며, 숫자 방식 chmod 640과 같음
비밀번호 메모 같은 파일은 기타 사용자 권한을 모두 없애고, 가능하면 서버에 두지 않음
#umask 설정과 확인
umask
echo 'umask 022' >> ~/.bash_profile
source ~/.bash_profile
umask
ls -l $ORACLE_BASE/diag/rdbms/<db_name>/<SID>/trace/alert_<SID>.log
ls -ld $ORACLE_HOME결과 해석:
로그인할 때마다 umask를 정하려면 .bash_profile에 넣음
수업 과제는 022였으며, 표의 기준대로 Oracle 파일을 그룹, 기타에서 더 막으려면 027을 씀
수업 자료에는 umask 저장 명령과 alert 로그, Oracle 홈 권한 확인 결과가 적혀 있지 않음(확인 불가)
위 ls -l, ls -ld는 그 확인에 쓰는 명령임
umask는 이미 있는 파일의 권한을 바꾸지 않고 이후 새로 만드는 파일에만 적용됨
#야간 백업 스크립트 장애 (권한, 디렉터리, 환경)
./db_backup.sh
ls -l db_backup.sh
chmod u+x db_backup.sh
./db_backup.sh
ls -ld log
chmod u+x log
./db_backup.sh
cat batch.envexport ORACLE_HOME=/u01/app/oracle/product/19c/db_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH결과 해석:
리눅스 이수자 평가 6번 문제이며 막히는 곳이 셋임
스크립트에 실행 권한이 없음(644), log 디렉터리에 소유자 x가 없어 로그 파일을 열 수 없음, batch.env가 ORACLE_SID를 export하지 않고 PATH를 $ORACLE_HOME/bin 하나로 덮어씀
PATH=$ORACLE_HOME/bin처럼 덮어쓰면 date, which 같은 기본 명령도 찾지 못하므로 기존 $PATH를 뒤에 이어 붙임
예상값: log/backup.log에 시작 시각, .../db_1/bin/sqlplus 경로, SID=orcl이 찍힘
고칠 때마다 ls -l(파일), ls -ld(디렉터리)로 확인하고 다음 오류로 넘어감
#사용 조건과 주의사항
chmod -R 777은 점검에서 바로 적발되는 설정이며, 문제를 풀려고 임시로 열었다면 반드시 되돌림
Oracle 홈 아래 실행 파일 일부(oradism, extjob 등)는 설치 때 root 소유, 특수 권한으로 설정되므로 홈 전체에 chmod -R이나 chown -R을 하지 않음