permission=$(stat -c "%a" /etc/hosts): stat -c "%a" 명령어를 사용하여 /etc/hosts 파일의 권한을 숫자로 저장합니다. 이 값은 permission이라는 변수에 저장됩니다.
owner=$(stat -c "%U" /etc/hosts): stat -c "%U" 명령어를 사용하여 /etc/hosts 파일의 소유자를 확인하고, 이를 owner 변수에 저장합니다.
if [ "$permission" -le 600 ] && [ "$owner" = "root" ]; then: 파일의 권한($permission)이 600 이하이고(-le는 작거나 같음을 의미), 소유자가 "root"일 때 조건을 확인합니다.
echo "파일 권한 설정이 양호합니다": 만약 위 조건이 충족되면 "파일 권한 설정이 양호합니다"를 출력합니다.
else: 앞선 조건이 거짓인 경우에 실행되는 부분입니다.
echo "파일 권한 설정이 취약합니다": 파일 권한이 취약할 때 "파일 권한 설정이 취약합니다"를 출력하고, 다음 명령어로 넘어갑니다.
chmod 600 /etc/hosts: /etc/hosts 파일의 권한을 chmod 600 명령어를 통해 600 이하로 변경합니다.
echo "파일의 권한을 600 이하로 변경하였습니다": 변경 완료 메시지를 출력합니다.
[U-10(상)] 2.6 /etc/(x)inetd.conf 파일 소유자 및 권한 설정
[U-11(상)] 2.7 /etc/syslog.conf 파일 소유자 및 권한 설정
구문 설명
-l /etc/rsyslog.conf: rsyslog.conf 파일의 세부적인 권한과 소유자 정보를 보여줍니다.
permission=$(stat -c "%a" /etc/rsyslog.conf): stat 명령어를 사용하여 rsyslog.conf 파일의 권한 정보를 변수 permission에 저장합니다.
owner=$(stat -c "%U" /etc/rsyslog.conf): 마찬가지로 stat 명령어를 사용하여 rsyslog.conf 파일의 소유자 정보를 변수 owner에 저장합니다.
조건문: if 문을 통해 권한과 소유자를 검사합니다.
([ "$permission" -le 640 ] && ([ "$owner" = "root" ] || [ "$owner" = "bin" ] || [ "$owner" = "sys" ])): 파일의 권한이 640 이하이고, 소유자가 "root", "bin", "sys" 중 하나인 경우를 검사합니다.
조건에 따른 작업:
조건을 만족하지 않을 경우(else), "파일 권한 설정이 취약합니다"를 출력하고, sudo chmod 640 /etc/rsyslog.conf 명령어를 사용하여 파일의 권한을 640으로 변경합니다. 그리고 변경된 권한을 출력하며 보여줍니다(ls -l /etc/rsyslog.conf).
[U-12(상)] 2.8 /etc/services 파일 소유자 및 권한 설정
구문 설명
ls -l /etc/services: services 파일의 세부적인 권한과 소유자 정보를 출력합니다.
file_permission=$(stat -c "%a" /etc/services): stat 명령어를 사용하여 services 파일의 권한 정보를 변수 file_permission에 저장합니다.
file_owner=$(stat -c "%U" /etc/services): 마찬가지로 stat 명령어를 사용하여 services 파일의 소유자 정보를 변수 file_owner에 저장합니다.
조건문: 파일의 권한과 소유자를 검사합니다.
(( $file_permission <= 644 )) && [[ $file_owner == "root" || $file_owner == "bin" || $file_owner == "sys" ]]: 파일의 권한이 644 이하이고, 소유자가 "root", "bin", "sys" 중 하나인 경우를 검사합니다.
조건에 따른 작업:
조건을 만족하지 않을 경우(else), "보안 설정이 취약합니다"를 출력하고, sudo chown root:root /etc/services 명령어를 사용하여 파일의 소유자를 root로 변경하고, sudo chmod 644 /etc/services 명령어를 사용하여 파일의 권한을 644로 변경합니다. 그리고 변경된 권한과 소유자를 설명하는 문구를 출력합니다.
[U-13(상)] 2.9 SUID, SGID, 설정 파일점검
구문설명
files_to_check: SUID와 SGID 설정을 확인할 파일들의 리스트가 이곳에 포함됩니다.
for file in "${files_to_check[@]}"; do: 파일 리스트를 반복하며 각 파일에 대한 검사를 진행합니다.
permissions=$(ls -alL "$file" | awk '{print $1}' | grep -i 's'): 파일의 권한을 확인하여 SUID나 SGID 설정 여부를 확인합니다.
if [[ -z $permissions ]]; then: SUID나 SGID 설정이 없는 경우 양호한 설정으로 간주하고 해당 파일의 이름을 출력합니다.
else: SUID나 SGID 설정이 있는 경우 취약한 설정으로 판단하고 해당 파일의 이름을 출력합니다.
all_secure=true: 모든 파일이 양호한 설정인지 여부를 나타내는 변수를 초기화합니다.
if [ "$all_secure" = false ]; then: 모든 파일을 확인한 후, 취약한 파일이 있을 경우에만 다음 작업을 수행합니다.
사용자에게 취약한 파일들을 제거할 것인지 물어봅니다. 사용자의 입력에 따라 제거를 진행하거나 취소합니다.
for file in "${files_to_check[@]}"; do: 취약한 파일들을 순회하며 각 파일의 SUID와 SGID 설정을 제거합니다.
! \( -path '/proc*' -o -path '/sys/fs*' -o -path '/usr/local*' -prune \): -path 플래그를 사용하여 특정 경로를 제외하고 검색합니다. /proc, /sys/fs, /usr/local 경로를 제외하고 -prune를 사용하여 하위 디렉토리를 검색하지 않도록 설정합니다.
세부 설명
-path '/proc*': /proc 디렉토리와 해당 패턴으로 시작하는 모든 하위 디렉토리를 나타냅니다.
-o: OR 연산자를 의미하며, 다음 조건을 추가합니다.
-path '/sys/fs*': /sys/fs 디렉토리와 해당 패턴으로 시작하는 모든 하위 디렉토리를 나타냅니다.
-o: 또 다른 OR 연산자로, 다음 조건을 추가합니다.
-path '/usr/local*': /usr/local 디렉토리와 해당 패턴으로 시작하는 모든 하위 디렉토리를 나타냅니다.
-prune: 이전의 모든 경로 조건에 해당하는 디렉토리들의 하위 항목 검색을 중단하고, 해당 디렉토리들을 검색 대상에서 제외합니다.
-perm -2: 파일에 대해 권한이 '쓰기' 권한이 있는지 확인합니다.
-type f: 검색 결과로 반환되는 항목의 종류가 파일인지 확인합니다.
-exec ls -al {} \;: 찾은 각 파일에 대해 ls -al 명령어를 실행하여 상세 정보를 출력합니다.