ИспользованиС SSH ΠΏΠΎΠ²Π΅Ρ€Ρ… UNIX-сокСта вмСсто sudo для избавлСния ΠΎΡ‚ suid-Ρ„Π°ΠΉΠ»ΠΎΠ²

Π’ΠΈΠΌΠΎΡ‚ΠΈ РавьС (Timothee Ravier) ΠΈΠ· ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Red Hat, мэйнтСйнСр ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Fedora Silverblue ΠΈ Fedora Kinoite, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» способ ΡƒΡ…ΠΎΠ΄Π° ΠΎΡ‚ примСнСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ sudo, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ suid-Π±ΠΈΡ‚ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ. ВмСсто sudo для выполнСния ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ root прСдлагаСтся Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ ssh с Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ соСдинСниСм ΠΊ Ρ‚ΠΎΠΉ ΠΆΠ΅ систСмС Ρ‡Π΅Ρ€Π΅Π· UNIX-сокСт ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡ΠΈΠΉ Π½Π° основС SSH-ΠΊΠ»ΡŽΡ‡Π΅ΠΉ.

ИспользованиС ssh вмСсто sudo позволяСт ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ suid-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² систСмС ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ Π² хост-ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ дистрибутивов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½ΡƒΡŽ ΠΈΠ·ΠΎΠ»ΡΡ†ΠΈΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Fedora Silverblue, Fedora Kinoite, Fedora Sericea ΠΈ Fedora Onyx. Для ограничСния доступа Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ задСйствовано ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡ΠΈΠΉ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ USB-Ρ‚ΠΎΠΊΠ΅Π½Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Yubikey).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ настройки сСрвСрных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² OpenSSH для доступа Ρ‡Π΅Ρ€Π΅Π· Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Unix-сокСт (Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр sshd со своим Ρ„Π°ΠΉΠ»ΠΎΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ):

/etc/systemd/system/sshd-unix.socket: [Unit] Description=OpenSSH Server Unix Socket Documentation=man:sshd(8) man:sshd_config(5) [Socket] ListenStream=/run/sshd.sock Accept=yes [Install] WantedBy=sockets.target

/etc/systemd/system/[email protected]: [Unit] Description=OpenSSH per-connection server daemon (Unix socket) Documentation=man:sshd(8) man:sshd_config(5) Wants=sshd-keygen.target After=sshd-keygen.target [Service] ExecStart=-/usr/sbin/sshd -i -f /etc/ssh/sshd_config_unix StandardInput=socket

/etc/ssh/sshd_config_unix: # ΠžΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌ PermitRootLogin prohibit-password PasswordAuthentication no PermitEmptyPasswords no GSSAPIAuthentication no # ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ доступ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ AllowUsers root adminusername # ΠžΡΡ‚Π°Π²Π»ΡΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ использованиС .ssh/authorized_keys (Π±Π΅Π· .ssh/authorized_keys2 AuthorizedKeysFile .ssh/authorized_keys # Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ sftp Subsystem sftp /usr/libexec/openssh/sftp-server

АктивируСм ΠΈ запускаСм ΡŽΠ½ΠΈΡ‚ systemd: sudo systemctl daemon-reload sudo systemctl enable —now sshd-unix.socket

ДобавляСм свой SSH-ΠΊΠ»ΡŽΡ‡ Π² /root/.ssh/authorized_keys

НастраиваСм Ρ€Π°Π±ΠΎΡ‚Ρƒ SSH-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

УстанавливаСм ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ socat: sudo dnf install socat

ДополняСм /.ssh/config, ΡƒΠΊΠ°Π·Π°Π² socat Π² качСствС прокси для доступа Ρ‡Π΅Ρ€Π΅Π· UNIX-сокСт: Host host.local User root # Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ /run/host/run вмСсто /run для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ProxyCommand socat — UNIX-CLIENT:/run/host/run/sshd.sock # ΠŸΡƒΡ‚ΡŒ ΠΊ SSH-ΠΊΠ»ΡŽΡ‡Ρƒ IdentityFile ~/.ssh/keys/localroot # Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ TTY для ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ RequestTTY yes # Π£Π±ΠΈΡ€Π°Π΅ΠΌ лишний Π²Ρ‹Π²ΠΎΠ΄ LogLevel QUIET

Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ adminusername Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ смоТСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ root Π±Π΅Π· Π²Π²ΠΎΠ΄Π° пароля. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ: $ ssh host.local [root ~]#

Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Π² bash псСвдоним sudohost для запуска «ssh host.local» ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с sudo: sudohost() { if [[ ${#} -eq 0 ]]; then ssh host.local «cd \»${PWD}\»; exec \»${SHELL}\» —login» else ssh host.local «cd \»${PWD}\»; exec \»${@}\»» fi }

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ: $ sudohost id uid=0(root) gid=0(root) groups=0(root)

ДобавляСм ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡ΠΈΠΉ ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π΄Π²ΡƒΡ…Ρ„Π°ΠΊΡ‚ΠΎΡ€Π½ΡƒΡŽ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΡƒΡŽ доступ ΠΊ root Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ вставкС USB-Ρ‚ΠΎΠΊΠ΅Π½Π° Yubikey.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉΡΡ Yubikey: lsusb -v 2>/dev/null | grep -A2 Yubico | grep «bcdDevice» | awk ‘{print $2}’

Если Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ 5.2.3 ΠΈΠ»ΠΈ большСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ed25519-sk ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΈΠ½Π°Ρ‡Π΅ — ecdsa-sk: ssh-keygen -t ed25519-sk ΠΈΠ»ΠΈ ssh-keygen -t ecdsa-sk

ДобавляСт ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π² /root/.ssh/authorized_keys

ДобавляСм привязку ΠΊ Ρ‚ΠΈΠΏΡƒ ΠΊΠ»ΡŽΡ‡Π° Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ sshd: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes [email protected],[email protected]

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ доступ ΠΊ Unix-сокСту Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ (Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ — adminusername). Π’ /etc/systemd/system/sshd-unix.socket добавляСм: [Socket] … SocketUser=adminusername SocketGroup=adminusername SocketMode=0660

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ