LINUX.ORG.RU

selinux sshd - socket: Permission denied

 ,


0

1

День добрый!

есть centos7

есть желание «нестандартно» запускать демона sshd через tcpserver (ucspi-tcp: http://cr.yp.to/ucspi-tcp/tcpserver.html)

selinux = enforced

strace-ом удалось (?) понять, что при попытки соединения вываливается ошибка доступа к сокету 0 (stdin).

...strace -y -yy...

...
2048  dup(0<socket:[21919]>)            = 3
...
2049  write(4<socket:[21919]>, "\0\0\5\374\7\24\314\262& \220\360\305\0104\270!s\236\226%\260\0\0\0\267ecdh-s"..., 1536) = -1 EACCES (Permission denied)
...

Если setenforce = 0, то всё работает. В логи audit'а ничего толкового про ошибку не пишет, разве что приложение выдает failed:

type=CRYPTO_KEY_USER msg=audit(1424107720.571:514): pid=2172 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=server fp=*** direction=? spid=2172 suid=0  exe="/usr/sbin/sshd" hostname=? addr=79.*** terminal=? res=success'
type=CRYPTO_KEY_USER msg=audit(1424107720.573:515): pid=2172 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=server fp=*** direction=? spid=2172 suid=0  exe="/usr/sbin/sshd" hostname=? addr=79.*** terminal=? res=success'
type=CRYPTO_KEY_USER msg=audit(1424107720.585:516): pid=2171 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=server fp=*** direction=? spid=2171 suid=0  exe="/usr/sbin/sshd" hostname=? addr=79.*** terminal=? res=success'
type=CRYPTO_KEY_USER msg=audit(1424107720.586:517): pid=2171 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=server fp=*** direction=? spid=2171 suid=0  exe="/usr/sbin/sshd" hostname=? addr=*** terminal=? res=success'
type=USER_LOGIN msg=audit(1424107720.587:518): pid=2171 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=login acct=28756E*****7229 exe="/usr/sbin/sshd" hostname=? addr=79.*** terminal=ssh res=failed'

не могу побороть, прошу помощи! :)

Я не понял, что именно вы хотели показать выводом strace, какой процесс не может записать в сокет?

Раньше в SeLinux была переменная run_ssh_inetd, правда пишут, что она не работала: http://www.archivum.info/fedora-selinux-list@redhat.com/2010-01/00109/Re-Cent... но, всё равно посмотрите, с каким контекстом у вас работает tcpserver.

mky ★★★★★ ()
Ответ на: комментарий от mky

попробовал, - не помогло.

[root@localhost bin]# ls -Z ./tcpserver
-rwxr-xr-x. root root system_u:object_r:inetd_exec_t:s0 ./tcpserver

По умолчанию - bin_t. Делал его и inetd_t и inetd_exec_t, - безрезультатно. Самое грустное, что в логах selinux'а не пишется ничего информативного! Т.е. вываливается ошибка приложения и все (вот почему я полез стрейсить):

 
type=USER_LOGIN msg=audit(1424107720.587:518): pid=2171 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=login acct=28756E*****7229 exe="/usr/sbin/sshd" hostname=? addr=79.*** terminal=ssh res=failed'

может что-то из bool-ов надо включить?

[root@localhost audit]# getsebool -a |grep ssh
fenced_can_ssh --> off
selinuxuser_use_ssh_chroot --> off
sftpd_write_ssh_home --> off
ssh_chroot_rw_homedirs --> off
ssh_keysign --> off
ssh_sysadm_login --> off

как ещё можно диагностировать сложность? Можно ли как-то включить 'debug mode' в selinux?.. с verbose поподробнее.... :)

andyg0 ()
Ответ на: комментарий от mky

run_ssh_inetd - нету в CentOS 7. Можно ли как-то (да и имеет ли смысл?) «скопировать» из предыдущих RH/Centos'ов эту политику?

andyg0 ()
Ответ на: комментарий от andyg0

Политики, ИМХО, лучше не смешивать, там всё достаточно сильно меняется от версии к версии.

Есть команда ″semodule -DB″ она убирает ″dontaudit″ в правилах, тогда в лог должно сыпаться больше. Может будет понятнее.

Ещё попробуйте дать tcpserver тот же контекст, что и у sshd (system_u:object_r:sshd_exec_t), может поможет.

mky ★★★★★ ()
Ответ на: комментарий от mky

Спасибо за подсказку с dontaudit! Как и ожидалось «проблема» всё же в sshd, запущенном через «обёртку».

Добавил правило:

module sshtcpserver 1.2;

require {
        type chkpwd_t;
        type sshd_t;
        type sshd_net_t;
        type init_t;
        class process { siginh noatsecure rlimitinh };
        class tcp_socket { write read };
}

#============= sshd_net_t ==============
allow sshd_net_t init_t:tcp_socket { write read };

#============= sshd_t =(для верности. хотя и без него заработало)=============
allow sshd_t chkpwd_t:process { siginh rlimitinh noatsecure };

и всё заработало.

PS: tcpserver вернул в *:bin_t. Роли не играло. Ибо он всё равно из-под daemontool запускается с контекстом init_t.

andyg0 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.