LINUX.ORG.RU
ФорумAdmin

Chroot и SFTP/SSHFS + SSH доступ

 , , , ,


0

1

Доброго времени суток! У меня следующая задача:
Создать окружение с небольшим числом бинарников, доступное через ssh и всем пользователям нужна sshfs.

Система Arch Linux ARM, openssh версии 6.9p1-2, клиенты используют Arch Linux/Mint/Fedora, тестирую на арче.

Создан chroot каталог /developers-jail(владелец root:root), pacstrap'ом сформировано дерево каталогов, залиты нужные бинарники и либы.
Для теста создал группу пользователей developers, туда включил user'а dev1.

Содержимое /developers-jail/home/:

drwx------  2 dev1 dev1 4096 Aug 13 00:38 dev1
Внутри каталога разработчика валяются пока только .bashrc, .bash_profile, .bash_logout.
В chroot'е в passwd, shadow добавлен dev1, whoami работает.

Конец sshd_config такой:

Subsystem       sftp    /usr/lib/ssh/sftp-server

Match Group developers
        ChrootDirectory /developers-jail/
        PermitTunnel no
        AllowTcpForwarding no
По ssh спокойно заходит в шелл, запускает /bin/bash, chroot'ит разраба в /developers-jail, отправляет его по дефолту в его домашний каталог в chroot'е, всё прекрасно, он работает.

Проблема: sftp/sshfs не хотят работать без ForceCommand internal-sftp, а с ним естественно не работает доступ к шеллу по ssh. sftp/sshfs прекрасно авторизуются на сервере по ключам, но тут же выкидывает и никакого доступа к файловой системе не даёт. Голову уже сломал об это.

Логи со стороны клиента(sftp, DEBUG3 режим):

Authenticated to 192.168.1.6 ([192.168.1.6]:22).
debug2: fd 4 setting O_NONBLOCK
debug3: fd 5 is O_NONBLOCK
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug2: callback start
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x08
debug2: client_session2_setup: id 0
debug1: Sending subsystem: sftp
debug2: channel 0: request subsystem confirm 1
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel 0: rcvd adjust 2097152
debug2: channel_input_status_confirm: type 99 id 0
debug2: subsystem request accepted on channel 0
debug2: channel 0: rcvd eof
debug2: channel 0: output open -> drain
debug2: channel 0: obuf empty
debug2: channel 0: close_write
debug2: channel 0: output drain -> closed
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
debug2: channel 0: rcvd eow
debug2: channel 0: close_read
debug2: channel 0: input open -> closed
debug2: channel 0: rcvd close
debug3: channel 0: will not send data after close
debug2: channel 0: almost dead
debug2: channel 0: gc: notify user
debug2: channel 0: gc: user detached
debug2: channel 0: send close
debug2: channel 0: is dead
debug2: channel 0: garbage collecting
debug1: channel 0: free: client-session, nchannels 1
debug3: channel 0: status: The following connections are open:
  #0 client-session (t4 r0 i3/0 o3/0 fd -1/-1 cc -1)

debug1: fd 0 clearing O_NONBLOCK
debug3: fd 1 is not O_NONBLOCK
Transferred: sent 2196, received 1764 bytes, in 0.1 seconds
Bytes per second: sent 20396.2, received 16383.8
debug1: Exit status 127
Connection closed
Логи со стороны сервера(sshd, DEBUG3 режим):
Accepted publickey for dev1 from 192.168.1.2 port 43820 ssh2: ED25519 SHA256:***********тут была SHA256 сумма*******
debug1: monitor_child_preauth: dev1 has been authenticated by privileged process
debug3: mm_get_keystate: Waiting for new keys
debug3: mm_request_receive_expect entering: type 26
debug3: mm_request_receive entering
debug3: mm_get_keystate: GOT new keys
debug2: userauth_pubkey: authenticated 1 pkalg ssh-ed25519 [preauth]
debug3: auth2_update_methods_lists: updating methods list after "publickey" [preauth]
debug2: authentication methods list 0 complete [preauth]
debug3: mm_request_send entering: type 26 [preauth]
debug3: mm_send_keystate: Finished sending state [preauth]
debug1: monitor_read_log: child log fd closed
debug3: mm_share_sync: Share sync
debug3: mm_share_sync: Share sync end
debug3: ssh_sandbox_parent_finish: finished
User child is on pid 1477
debug3: safely_chroot: checking '/'
debug3: safely_chroot: checking '/developers-jail/'
debug3: safely_chroot: checking '/developers-jail/'
debug3: mm_request_receive entering
debug1: server_input_global_request: rtype keepalive@openssh.com want_reply 1


Буду очень рад помощи! Казалось бы осталось сделать так мало, но пока что мой мозг сломался об это.

Давайте читать man вместе

For file transfer sessions using “sftp”, no additional configuration of the environment is necessary if the in-process sftp server is used, though sessions which use logging may require /dev/log inside the chroot directory on some operating systems (see sftp-server(8) for details).

hizel ★★★★★ ()
Ответ на: комментарий от hizel
mkdir /developers-jail/dev
touch /developers-jail/dev/log
chmod 511 /developers-jail/dev/log
chattr +i /developers-jail/dev/
mount --bind /dev/log /developers-jail/dev/log

Увы всё так и осталось:

debug1: Exit status 127
remote host has disconnected

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

С ForceCommand таких ошибок нет, а 127 номер ошибки говорит о том, что нет какого-то файла? Вроде все логи включил на DEBUG3,но не вижу ничего конкретного в journalctl -u sshd :( Юзеры вне chroot'а спокойно используют и ssh и sshfs.

TwilightAnon ()
Ответ на: комментарий от TwilightAnon
debug2: subsystem request for sftp by user dev1
debug1: subsystem: cannot stat /usr/lib/ssh/sftp-server: No such file or directory
debug1: subsystem: exec() /usr/lib/ssh/sftp-server -f AUTHPRIV -l VERBOSE
Starting session: subsystem 'sftp' dev1 from 192.168.1.2 port 45182
debug2: fd 3 setting TCP_NODELAY
debug3: Copy environment: MAIL=/var/spool/mail/dev1
debug3: ssh_packet_set_tos: set IP_TOS 0x08
debug3: Copy environment: XDG_SESSION_ID=c10
debug2: fd 10 setting O_NONBLOCK
debug3: Copy environment: XDG_RUNTIME_DIR=/run/user/1001
debug2: fd 9 setting O_NONBLOCK
debug2: fd 12 setting O_NONBLOCK
debug2: channel 0: read 58 from efd 12
debug3: channel 0: discard efd
debug2: channel 0: read<=0 rfd 10 len 0
debug2: channel 0: read failed
debug2: channel 0: close_read
debug2: channel 0: input open -> drain
sshd[2051]: debug2: channel 0: ibuf empty
sshd[2051]: debug2: channel 0: send eof
sshd[2051]: debug2: channel 0: input drain -> closed
sshd[2051]: debug1: Received SIGCHLD.
sshd[2051]: debug1: session_by_pid: pid 2052
sshd[2051]: debug1: session_exit_message: session 0 channel 0 pid 2052
sshd[2051]: debug2: channel 0: request exit-status confirm 0
sshd[2051]: debug1: session_exit_message: release channel 0
sshd[2051]: debug2: channel 0: write failed
sshd[2051]: debug2: channel 0: close_write
sshd[2051]: debug2: channel 0: send eow
sshd[2051]: debug2: channel 0: output open -> closed
sshd[2051]: debug2: channel 0: read 0 from efd 12
sshd[2051]: debug2: channel 0: closing read-efd 12
sshd[2051]: debug2: channel 0: send close
sshd[2051]: debug3: channel 0: will not send data after close
sshd[2051]: debug2: notify_done: reading
sshd[2051]: debug3: channel 0: will not send data after close
sshd[2051]: debug2: channel 0: rcvd close
sshd[2051]: Received disconnect from 192.168.1.2: 11: disconnected by user
sshd[2051]: Disconnected from 192.168.1.2

Немного более подробный лог

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

Есть в chroot'е весь openssh

лог врет? ты же лучше знаешь, отпинай его, чтобы не врал, сука.

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

Вики устаревшая лет на 5, syslog-ng уже давно канул в лету и его сменил journalctl.
Всем спасибо! И Анониму тоже. Для тех кто найдёт тред оставлю решение:

Match Group developers
        ChrootDirectory /developers-jail/
        PermitTunnel no
        AllowTcpForwarding no
Добавляем юзверей, прописываем им директории /home/%username%, но без -m.
создаём(у меня на отдельном разделе) chroot директорию developers-jail, в неё pacstrap'ом заливаем небольшой набор для выживания:
pacstrap -i /developers-jail/ bash coreutils filesystem file openssh tar vim-minimal gzip bzip2 which
После этого идём в chroot директорию и делаем следующее:
mknod dev/urandom c 1 9
mknod -m 666 dev/null c 1 3
mknod -m 666 dev/zero c 1 5
mknod -m 666 dev/tty c 5 0
grep /etc/passwd -e "%username%" >> etc/passwd
grep /etc/group -e "%username%" > etc/group
chmod 755 dev
touch dev/log
mount --bind /dev/log dev/log
И нужно ещё линкануть sftp-server куда-нибудь в директорию из PATH:
ln usr/lib/ssh/sftp-server usr/bin
После этого по ssh юзеры будут попадать в свою home директорию внутри chroot'а, а sshfs открывает корень chroot'а. Было бы круто конечно если бы sshfs тоже попадала в домашнюю, но пока ещё не понял как это сделать.

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