Назад | Перейти на главную страницу

SELinux не позволяет мне запускать sshd под портом 443

Я использую Redhat 7.7. Я пытаюсь разрешить ssh-service принимать соединения как через порт 22, так и через порт 443. Я уже открыл firewalld с помощью

sudo firewall-cmd --add-port=443/tcp --permanent
sudo firewall-cmd --reload

И установить

Port 22
Port 443

в /etc/ssh/sshd_config и перезагрузился с

sudo systemctl reload sshd

Но sudo journalctl -u sshd по-прежнему говорит, что не может привязаться к 443. Что мне теперь делать?

Вам не нужно создавать локальную политику, вы можете изменить тип порта SELinux порта 443 на что-то подходящее, используя semanage (8).

semange port -l | grep ssh
ssh_port_t                     tcp      22

Поэтому нам нужно изменить тип порта на ssh_port_t

semanage port -m -t ssh_port_t -p tcp 443  

и проверить

semange port -l | grep ssh
ssh_port_t                     tcp      443, 22

Я новичок в selinux. Но начнем. Я следил за этим руководством SELinux - 5.6. Сбор журналов аудита в разрешающем режиме

Переключитесь на root, поскольку вам понадобятся права root для всех следующих команд

sudo su

Во-первых, вам нужно определить, какой semodule блокирует ваш порт:

ausearch -m avc

Это покажет вам некоторые недавние ошибки. Вам нужно посмотреть, с каким контекстом возникает ошибка. Для меня это было sshd_t

time-> <timestamp>
type=PROCTITLE msg=audit(1567419463.747:16052): proctitle=2F7573722F7362696E2F73736864002D44
type=SYSCALL msg=audit(1567419463.747:16052): arch=c000003e syscall=49 success=no exit=-13 a0=3 a1=55f0f8e1cce0 a2=10 a3=7ffee40f91a8 items=0 ppid=1 pid=1339 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="sshd" exe="/usr/sbin/sshd" subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 key=(null)
type=AVC msg=audit(1567419463.747:16052): avc:  denied  { name_bind } for  pid=1339 comm="sshd" src=443 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:http_port_t:s0 tclass=tcp_socket permissive=0

Установите модуль, найденный в scontext, временно на разрешающий. Перезагрузите службу sshd и посмотрите, работает ли она сейчас.

semanage permissive -a sshd_t
systemctl reload sshd
journalctl -u sshd

Если это сработает, теперь мы можем создать наш собственный локальный semodule. В этом примере я называю это sshdlocal.

Команда Follwing показывает, как будет выглядеть новое правило:

grep sshd_t /var/log/audit/audit.log | audit2allow -m sshdlocal

В моем случае:

module sshdlocal 1.0;

require {
        type http_port_t;
        type sshd_t;
        class tcp_socket name_bind;
}

#============= sshd_t ==============

#!!!! This avc is allowed in the current policy
allow sshd_t http_port_t:tcp_socket name_bind;

Чтобы создать и установить semodule. Сделай это:

grep sshd_t /var/log/audit/audit.log | audit2allow -M sshdlocal
semodule -i sshdlocal.pp

Вы можете перечислить все семодули следующим образом:

semodule -l

Теперь удалите разрешающий sshd_t, перезагрузите sshd_config и проверьте с помощью journalctl, работает ли установка.

semanage permissive -d sshd_t
systemctl reload sshd
journalctl -u sshd