그래서 CentOS Linux 버전 8.2.2004에서 ansible 배포를 통해 systemd를 사용하여 서비스(추적 서비스의 일부로 실행되는 바이너리 실행 파일인 "kite 에이전트"라고 함)를 시작하려고 했습니다.
이것은 systemd에서 사용하는 kite_agent.service 파일입니다.
[Unit]
Description=kite_agent
After=network.target
[Service]
ExecStart=/kite_agent/kite-agent --config-file=/kite_agent/kite-agent.yml
Restart=always
StandardOutput=syslog
SyslogIdentifier=kite-agent
User=kite
Group=kite
[Install]
WantedBy=multi-user.target
위 .service 파일의 "/kite_agent" 디렉터리에는 다음과 같은 권한이 있습니다.
dr-x------. 2 kite kite unconfined_u:object_r:default_t:s0 117 Jul 21 10:42 kite_agent
"/kite_agent" 내의 파일에는 다음과 같은 권한이 있습니다(설명된 대로 ls -laZ
).
dr-x------. 2 kite kite unconfined_u:object_r:default_t:s0 117 Jul 21 10:42 .
dr-xr-xr-x. 19 root root system_u:object_r:root_t:s0 256 Jul 21 10:41 ..
-r--------. 1 kite kite system_u:object_r:default_t:s0 1769 Jul 21 10:42 agent.cert
-rw-r--r--. 1 root root system_u:object_r:default_t:s0 1582 Jul 21 10:42 agent.csr
-r--------. 1 kite kite system_u:object_r:default_t:s0 3243 Jul 21 10:42 agent.key
-rwxrwxrwx. 1 kite kite system_u:object_r:default_t:s0 1696 Jul 21 10:42 ca.cert
-r-xr-xr-x. 1 kite kite system_u:object_r:default_t:s0 25956781 Jul 21 10:41 kite-agent
-r-xr-xr-x. 1 kite kite system_u:object_r:default_t:s0 256 Jul 21 10:42 kite-agent.yml
"/kite_agent" 디렉터리에 "system_u" 컨텍스트에 대한 권한이 있어야 한다는 것이 맞습니까? 예를 들면 다음과 같습니다.
kite kite system_u:object_r:default_t:s0
Journalctl을 통해 다음 메시지가 표시됩니다.
kite_agent.service: Failed at step EXEC spawning /kite_agent/kite-agent: Permission denied
kite_agent.service: Main process exited, code=exited, status=203/EXEC
편집하다:
아래에는 보다 기본적인 진단 정보가 포함되어 있습니다.
영업 systemctl status auditd
이익:
● auditd.service
Loaded: masked (Reason: Unit auditd.service is masked.)
Active: inactive (dead)
영업 cat /etc/audit/auditd.conf
이익:
#
# Controls the configuration of the audit daemon
#
local_events = yes
write_logs = yes
log_file = /var/log/audit/audit.log
log_group = root
log_format = ENRICHED
flush = INCREMENTAL_ASYNC
freq = 50
max_log_file = 8
num_logs = 5
priority_boost = 4
name_format = NONE
##name = mydomain
max_log_file_action = ROTATE
space_left = 75
space_left_action = SYSLOG
verify_email = yes
action_mail_acct = root
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
use_libwrap = yes
##tcp_listen_port = 60
tcp_listen_queue = 5
tcp_max_per_addr = 1
##tcp_client_ports = 1024-65535
tcp_client_max_idle = 0
transport = TCP
krb5_principal = auditd
##krb5_key_file = /etc/audit/audit.key
distribute_network = no
q_depth = 400
overflow_action = SYSLOG
max_restarts = 10
plugin_dir = /etc/audit/plugins.d
영업 audit2allow -a
이익:
#============= ifconfig_t ==============
allow ifconfig_t vmware_log_t:file write;
불행히도 ausearch -m avc | grep kite
실행 결과는 아무것도 나오지 않았습니다.
영업 systemctl status auditd
이익:
● auditd.service - Security Auditing Service
Loaded: loaded (/etc/systemd/system/auditd.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2020-09-15 16:03:04 CDT; 6min ago
Docs: man:auditd(8)
https://people.redhat.com/sgrubb/audit/
Process: 157748 ExecStartPost=/sbin/augenrules --load (code=exited, status=0/SUCCESS)
Process: 157747 ExecStart=/sbin/auditd -n (code=exited, status=1/FAILURE)
Main PID: 157747 (code=exited, status=1/FAILURE)
Sep 15 16:03:04 my_app augenrules[157748]: enabled 1
Sep 15 16:03:04 my_app augenrules[157748]: failure 1
Sep 15 16:03:04 my_app augenrules[157748]: pid 2094
Sep 15 16:03:04 my_app augenrules[157748]: rate_limit 0
Sep 15 16:03:04 my_app augenrules[157748]: backlog_limit 8192
Sep 15 16:03:04 my_app augenrules[157748]: lost 0
Sep 15 16:03:04 my_app augenrules[157748]: backlog 0
Sep 15 16:03:04 my_app augenrules[157748]: backlog_wait_time 60000
Sep 15 16:03:04 my_app systemd[1]: auditd.service: Failed with result 'exit-code'.
Sep 15 16:03:04 my_app systemd[1]: Failed to start Security Auditing Service.
답변1
당연히 SELinux는 서비스가 인증된 시스템 서비스임을 나타내는 컨텍스트가 없는 디렉터리에서 서비스가 실행되는 것을 방지합니다.
실행 파일이 있는 디렉터리에는 다음과 유사한 컨텍스트가 필요할 가능성이 높습니다.
system_u:object_r:bin_t
아마도 이것으로 충분할 것입니다:
# chcon -u system_u -r object_r -t bin_t /kite_agent
/var/log/audit/audit.log
그러나 관련 뉴스를 게시하는 것이 좋습니다. 아마도 그것들을 얻는 것은 다음과 같이 간단할 것입니다:
# grep kite /var/log.audit/audit.log
-또는-
# ausearch -m avc | grep kite
이러한 명령이 작동하지 않으면 감사 서비스의 구성 및/또는 상태를 조사하십시오.
# systemctl status auditd
# cat /etc/audit/auditd.conf
auditd
서비스 실행이 중지 되면 문제를 해결하십시오. 다음과 같이 간단할 수 있습니다.
# systemctl start auditd
감사 로그의 관련 AVC 메시지를 사용하여 audit2allow
SELinux 자체 관점에서 문제를 해결하는 방법에 대한 제안을 얻을 수 있지만 때로는 다른 제안이 있을 수도 있습니다.
https://opensource.com/article/18/7/sysadmin-guide-selinuxSELinux 사용에 대한 다양하고 간결한 팁을 제공합니다. 해당 페이지부터 다음은 라벨링 문제를 해결하는 데 도움이 될 수 있습니다(이 질문에 대한 실제 답변을 예측하기 위해 일부 세부 사항이 변경되었지만). 이 스니펫은 컨텍스트의 다른 부분을 무시하므로 man semanage-fcontext
도움이 될 수도 있습니다. :
Labeling problem: If your files in /kite_agent are not labeled correctly, access might be denied. Here are some ways to fix this:
If you know the label:
# semanage fcontext -a -t bin_t '/kite_agent(/.*)?'
If you know the file with the equivalent labeling:
# semanage fcontext -a -e /kite_agent /path/to/dir
Restore the context (for both cases):
# restorecon -vR /kite_agent
다른 서비스가 포함된 경우 /usr/sbin
이는 적절할 수 있지만 다음 사항을 확인하세요.
# semanage fcontext -a -e /kite_agent /usr/sbin
# restorecon -vR /kite_agent
이 페이지에서는 문제 해결 팁도 제공합니다. 물론 특히 RedHat 또는 CentOS 사이트에는 더 자세한 문서가 있습니다.
질문에 AVC 세부 정보를 추가하면 좀 더 구체적인 도움이 될 수도 있습니다.