여기서는 멈추세요
- 명령 출력의 서버·서비스·경로가 예상 대상과 다르면 변경 단계로 넘어가지 않습니다.
- 현재 접속 세션, 백업 또는 콘솔 복구 경로를 확보하지 못했다면 상태 변경 명령을 실행하지 않습니다.
MANDATORY ACCESS
SAFE OPERATING BOUNDARY
변경 전 설정과 출력값을 기록하고, 예상과 다른 결과가 나오면 추가 변경을 멈춘 뒤 승인된 운영 복구 절차로 되돌립니다.
BEFORE YOU START
CHECK THE BRANCH
namei·stat·서비스 사용자 검증이 실패하면 AppArmor보다 UNIX 권한을 먼저 해결합니다.
profile, operation, name, requested_mask를 읽어 필요한 작업과 경로만 규칙 후보로 만듭니다.
일부 explicit deny는 로그가 남지 않을 수 있으므로 profile의 deny 규칙과 include도 검토합니다.
FOLLOW THE FLOW
Ubuntu에서는 AppArmor가 기본 MAC 체계이므로 비활성화를 해결책으로 사용하지 않습니다.
sudo aa-statuscat /sys/kernel/security/lsm대상 실행 파일의 profile이 enforce인지 complain인지 확인합니다.
profile이 없으면 일반 권한·systemd sandbox·다른 보안 계층을 확인합니다.
전체 로그를 공유하지 말고 장애 시각과 대상 profile로 범위를 좁힙니다.
sudo journalctl -k --since '-30 min' -g 'apparmor="DENIED"' --no-pagersudo grep 'apparmor="DENIED"' /var/log/audit/audit.log | tail -50profile은 적용 정책, operation은 작업, name은 대상, requested_mask와 denied_mask는 요청·거부 권한입니다.
정확한 profile 파일과 필요한 동작을 기록합니다.
/path/to/resource와 PROFILE_NAME을 실제 값으로 바꿉니다.
namei -l /path/to/resourcesudo find /etc/apparmor.d -maxdepth 2 -type f -name '*PROFILE_NAME*' -printsudo ls -la /etc/apparmor.d/local/일반 권한과 AppArmor 모두 허용해야 작업이 성공합니다. 패키지 파일 직접 수정 대신 local override 지원 여부를 확인합니다.
허용하려는 경로를 넓은 wildcard가 아니라 필요한 최소 범위로 정합니다.
aa-logprof는 로그를 바탕으로 대화형 규칙 후보를 제시하지만 모든 제안이 안전하거나 필요한 것은 아닙니다.
sudo apparmor_parser -p /etc/apparmor.d/PROFILE_NAMEsha256sum /etc/apparmor.d/PROFILE_NAME쓰기·실행·네트워크 권한이 요청 목적보다 넓어지지 않았는지 diff로 확인합니다.
변경 전 파일과 승인된 최소 규칙을 확보합니다.
profile을 disable하거나 전역 AppArmor를 끄지 않습니다.
sudo cp -a /etc/apparmor.d/PROFILE_NAME /etc/apparmor.d/PROFILE_NAME.before-changesudo aa-logprofapparmor-utils가 설치된 환경에서 제안된 glob·권한을 검토하고 불필요한 허용은 거절합니다.sudo apparmor_parser -r /etc/apparmor.d/PROFILE_NAMEsudo aa-enforce /path/to/executablesudo journalctl -k --since '-5 min' -g 'apparmor="DENIED"' --no-pager필요 작업은 성공하고 profile은 enforce 상태이며 새로운 불필요한 DENIED가 없어야 합니다.
오작동하면 백업 profile을 복원하고 apparmor_parser -r로 되돌립니다.
PRIMARY REFERENCES
배포판과 버전에 따라 옵션·로그 위치가 다를 수 있습니다. 실행 전 서버의 --help와 로컬 매뉴얼을 함께 확인하세요.