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


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



Последнее исправление: TwilightAnon (всего исправлений: 2)

Давайте читать 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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.