Estou tentando configurar o sshd para rodar no xinetd em um servidor RHEL7. Eu corro sshd em uma porta alternativa, usando xinetd para limitar quais IPs podem se conectar.
Isso funciona bem no RHEL6 e também no RHEL7 se eu desabilitar o SELinux. No entanto, a política SELinux direcionada no RHEL7 está impedindo isso.
Infelizmente, não é muito útil registrar em /var/log/audit quando falha. Minha tentativa de conexão produz duas linhas de operações CRYPTO_KEY_USER bem-sucedidas e, em seguida, esta (uma única linha, que envolvi):
type=USER_LOGIN msg=audit(1485378997.248:18523): pid=6812 uid=0
auid=4294967295 ses=4294967295
subj=system_u:system_r:sshd_t:s0-s0:c0.c1023
msg='op=login acct="(unknown)" exe="/usr/sbin/sshd"
hostname=? addr=A.B.C.D terminal=ssh res=failed'
audit2why
nem reconhece que existe um problema. Eu acho que está procurando eventos DENY ou algo assim, não falhas.
Adicionei log de depuração ao sshd e encontrei isto (não agrupado desta vez):
debug1: SELinux support enabled [preauth]
debug3: ssh_selinux_change_context: setting context from 'system_u:system_r:sshd_t:s0-s0:c0.c1023' to 'system_u:system_r:sshd_net_t:s0-s0:c0.c1023' [preauth]
debug3: privsep user:group 74:74 [preauth]
debug1: permanently_set_uid: 74/74 [preauth]
debug1: list_hostkey_types: ssh-rsa [preauth]
debug1: SSH2_MSG_KEXINIT sent [preauth]
Write failed: Permission denied [preauth]
Presumo que este seja o meu problema - a transição de sshd_t para sshd_net_t. No entanto, sem nenhuma informação útil dos logs de auditoria, atingi o limite de minhas habilidades de depuração do SElinux.
Um colega sugeriu que eu revisasse os logs de auditoria de uma conexão bem-sucedida no modo permissivo. Infelizmente, não há menção de uma ação bem-sucedida como sshd_net_t. Aqui estão as entradas de log relevantes: http://pastebin.com/raw/9sSVpgLq
Eu vi algumas informações relevantes no rastreador de bugs redhat, mas isso não me levou muito longe em direção a uma solução. https://bugzilla.redhat.com/show_bug.cgi?id=1008580
Acontece que certas regras do SELinux não são auditadas por padrão. Corrida:
permite o log de auditoria mesmo em regras "dontaudit" na política.
Depois que fiz isso, foi fácil rastrear as permissões SELinux ausentes (que eram
allow sshd_net_t inetd_t:tcp_socket (read|write);
).