SELinux + logrotate + prerotate = 권한 거부됨

SELinux + logrotate + prerotate = 권한 거부됨

나는 상당히 간단한 작업을 수행해야 합니다. 사용자 정의 로그 파일 세트를 밤새 데이터베이스로 마이그레이션하는 것입니다.

간단한 사전 회전 작업에는 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). 또한 이를 사용하여 audit2allowSELinux 오류 메시지와 가능한 해결 방법을 볼 수도 있습니다 .

또한 semanage permissive -a logrotate_tSELinux에서 거부하지 않고 logrotate가 실행되도록 허용해 보세요.

답변2

SELinux인지 확실하지 않은 경우 먼저 SELinux force를 일시적으로 비활성화해 보세요.sudo setenforce 0 SELinux 참조그리고 실패한 코드를 실행하세요. SELinux라면 계속 읽으세요..

나는 최근에 이 문제에 직면했고 SELinux를 처음 접했기 때문에 이것은 나에게 학습 곡선이었습니다. chmod& (DAC) 를 사용하는 표준 posix 모드 권한과 달리 chownSELinux 권한은 더 세부적입니다. 어떤 경우에는 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

관련 정보