나는 상당히 간단한 작업을 수행해야 합니다. 사용자 정의 로그 파일 세트를 밤새 데이터베이스로 마이그레이션하는 것입니다.
간단한 사전 회전 작업에는 logrotate(cron.daily)를 사용합니다.
/var/log/myapplog/*.log
{
daily
copytruncate
rotate 366
dateext
dateformat .%Y-%m-%d
compress
missingok
compresscmd /usr/bin/xz
compressoptions -ze9
compressext .xz
prerotate
/usr/local/myapp/bin/DBWriter $1
endscript
}
불행하게도 SELinux는 그렇게 생각하지 않습니다. 그러면 setenforce 0
스크립트가 완벽하게 실행됩니다. 로그를 회전하고 데이터베이스로 보내는 등의 작업을 수행
setenforce 1
하지만 다음을 반환합니다.
logrotate_script: line 1: /usr/local/myapp/bin/DBWriter: Permission denied
최근에 설정한 DBWriter의 컨텍스트를 변경해 보았지만 unconfined_u:unconfined_r:unconfined_t
작동하지 않습니다.
이상적으로는 SELinux를 활성화된 상태로 유지해야 합니다. 중요한 경우 DBWriter는 java .jar 파일로도 사용할 수 있습니다. 그러나 달리는 java -jar DBWriter.jar
결과는 같습니다.
미리 감사드립니다!
편집: Win.T 아래 답변으로 내 문제가 해결되었습니다.
semanage permissive -a logrotate_t
문제의 일부는 내가하려고하는 것입니다정확히SELinux는 다음을 방지하도록 설계되었습니다. 프로세스 A가 알 수 없는 파일 B를 실행하고 시스템 C에 혼란을 초래합니다.
프로젝트 설계 고려사항과 제약으로 인해 우리는 이 길을 택하게 되었습니다.
고객은 항상 보안이나 미래 보장과 같은 화려한 유행어를 듣고 싶어하지 않습니다.
답변1
보기 /var/log/messages
및 /var/log/audit/audit.log
(실행중인 경우 auditd
). 또한 이를 사용하여 audit2allow
SELinux 오류 메시지와 가능한 해결 방법을 볼 수도 있습니다 .
또한 semanage permissive -a logrotate_t
SELinux에서 거부하지 않고 logrotate가 실행되도록 허용해 보세요.
답변2
SELinux인지 확실하지 않은 경우 먼저 SELinux force를 일시적으로 비활성화해 보세요.sudo setenforce 0
SELinux 참조그리고 실패한 코드를 실행하세요. SELinux라면 계속 읽으세요..
나는 최근에 이 문제에 직면했고 SELinux를 처음 접했기 때문에 이것은 나에게 학습 곡선이었습니다. chmod
& (DAC) 를 사용하는 표준 posix 모드 권한과 달리 chown
SELinux 권한은 더 세부적입니다. 어떤 경우에는 TCP/443을 통한 인터넷 연결과 같은 특정 작업을 거부하거나 호출자(응용 프로그램)에 따라 /foo 및 /bar에 대한 쓰기를 허용하지만 다른 작업은 허용하지 않습니다.
ls -Z
파일(MAC) 필수 접근 제어 권한 이나 사용자를 보려면 id -Z
다음 출력 형식을 사용하십시오 user:role:type:level
.
Centos7의 경우 로그 파일을 회전하기 전에 업로드하는 사전 회전 스크립트가 포함된 logrotate.d conf 파일의 스크립트를 호출했습니다. 나는 /var/log/audit/audit.log
몇 번이나 거부(로그인)했습니다 . 설치할 특정 정책 패키지를 생성하는 데 사용할 수 있는 도구가 있다는 것을 이해합니다. 코드에 대한 .rpm 패키지를 생성하므로 설치 중에 정책 패키지를 생성하고 설치하기 위해 .spec 파일에 다음 단계를 모두 추가합니다.
뭐가 필요하세요:policycoreutils-python, checkpolicy(설치될 수 있음)
내가 이해한 바로는, 이 보안 정책을 배포할 계획이라면 *.te 파일을 전송하고 그 자리에서 정책을 생성하기만 하면 된다는 생각입니다. 따라서 정책이 의존하는 정의가 업데이트되면 해당 정의는 업데이트될 것입니다. 설치 시 상속됩니다.
#거절 메시지 찾기
watch "tail /var/log/audit/audit.log | grep 'denied'"
# te(유형 적용) 파일 생성(사람이 읽을 수 있는 보안 정책)
grep 1561055176.928:11371 /var/log/audit/audit.log|audit2allow -m myapp > myapp.te
# 일부 실패를 파악하여 모두 audit2allow로 파이프할 수도 있습니다.
cat /var/log/audit/audit.log | grep logrotate | audit2allow -m myapp > myapp.te
# audit2why를 사용하여 복구 단계가 때때로 실패하는 이유를 설명할 수도 있습니다.
cat /var/log/audit/audit.log | grep logrotate | audit2why
경고하다이 단계에서 나는 내 스크립트를 실행하면 작동할 것이라고 audit2why가 보고했다는 사실을 발견했습니다 setsebool -P nis_enabled 1
. 듣기에는 좋지만,언제나이러한 명령 실행이 보안에 미치는 영향을 찾아보세요. 이를 설정하면 공격 표면이 증가할 수 있으므로 사용자는 주의해야 합니다.
# 유형 적용 파일에서 정책 모듈 구축
checkmodule -M -m -o myapp.mod myapp.te
# 정책 모듈에서 정책 패키지 구축
semodule_package -o myapp.pp -m myapp.mod
# 정책 패키지를 로드하려면 루트 권한을 사용하십시오.
semodule -i myapp.pp
코드를 실행하는 데 필요한 모든 작은 권한을 축적할 때까지 이 단계를 여러 번 수행해야 했습니다.
- 갱신 -
logrotate cron 작업 전에 스크립트 인라인을 실행하여 logrotate_t의 권한을 확장할 필요가 없었습니다. 실패 시 파일을 회전하고 싶지 않기 때문에 사전 회전에 넣었는데 이 구문은 여전히 해당 요구 사항을 충족합니다. "&&" 구문을 사용하면 첫 번째 명령이 실패하면 두 번째 명령이 실행되지 않습니다.
10 * * * * root /usr/bin/sudo -i -u otheruser /opt/send_logs.sh && /usr/sbin/logrotate -f /path/to/myapp_logrotate.conf > /tmp/myapp_rotate.log 2&1