Konta SFTP-only możemy chcieć użyć, gdy mamy zainstalowany na serwerze SSH (prawie zawsze) i udostępniamy dane innemu systemowi, który loguje się i pobiera je (i ewentualnie usuwa), a nie chcemy instalować dodatkowej aplikacji jak FTPd czy HTTPd.
Zakładamy, że logowanie odbywa się automatycznie z użyciem klucza i bez hasła. Nazwa użytkownika na serwerze zdalnym to: copy z UID 2000, a grupa to sftponly z GID 2000. Serwer z SFTP to 10.7.18.2, a klient, z którego będziemy się logować to 10.7.18.1
Na pierwszy ogień musimy skongfigurować demona SSH, aby posiadał następujące wpisy:
Subsystem sftp internal-sftp AuthorizedKeysFile .ssh/authorized_keys AllowUsers copy@10.7.18.1 Match user copy ChrootDirectory %h ForceCommand internal-sftp AllowTCPForwarding no X11Forwarding no
Oraz żeby nie posiadał takiego wpisu lub podobnego
#Subsystem sftp /usr/libexec/openssh/sftp-server
Następnym krokiem jest utworzenie katalogu, gdzie chcemy mieć katalogi w chroot, ja utworze katalog chroot w głównym drzewie
mkdir /chroot
Po utworzeniu katalogu a przed utworzeniem użytkownika warto utworzyć osobną grupę dla użytkownika
groupadd -g 2000 sftponly
Teraz naszym zadaniem jest utworzenie użytkownika z shellem ustawionym na /bin/false i z katalogiem domowym w wybranym miejscu.
adduser -u 2000 -g 2000 -s /bin/false -d /chroot/copy copy
Konto zostało utworzone z następującymi prawami dostępu
ls -ald /chroot/copy/ drwx------. 2 copy sftponly 4096 Mar 3 12:32 /chroot/copy/
Muszą one zostać zedytowane tak, aby właścicielem katalogu domowego konta chrootowanego był root i trzeba trochę poluzować dostępy
chown root /chroot/copy chmod 755 /chroot/copy
Jeszcze musimy stworzyć katalog na klucze, nadać mu odpowiednie uprawnienia i wkopiować klucze publiczne, które będą mogły logować się do systemu, żeby skopiować jakieś dane za pomocą sftp
mkdir /chroot/copy/.ssh chown root:root /chroot/copy/.ssh
Teraz czas na wkopiowanie klucza publicznego i ustawienie mu odpowiednich uprawnień
echo 'AAAA...== user@maszyna' > /chroot/copy/.ssh/authorized_keys chown root:root /chroot/copy/.ssh/authorized_keys chmod 644 /chroot/copy/.ssh/authorized_keys
Po tych operacjach możemy zrestartować SSHD
service sshd restart
Jeżeli wykorzystujemy selinux w trybie enforcing, to musimy jeszcze skonfigurować dla plików i katalogów odpowiednie konteksty z użyciem aplikacji semanage dostępnej w pakiecie
policycoreutils-python
Same ustawienia kontekstów
semanage fcontext -a -t home_root_t "/chroot(/.*)?" semanage fcontext -a -t user_home_t "/chroot/copy(/.*)?" semanage fcontext -a -t ssh_home_t "/chroot/copy/.ssh(/.*)?" restorecon -FFrv /chroot
Po wykonaniu powyższych operacji konto copy powinno umożliwiać łączenie się do niego ze wskazanego klienta za pomocą komendy
sftp -o "IdentityFile=/sciezka/do/klucza/prywatnego" copy@10.7.18.2
Po zalogowaniu powinniśmy zobaczyć następujące okno
Connecting to 10.7.18.2... sftp>
Jeżeli tak nie jest i system odrzuca połączenie lub prosi o hasło warto rozpocząć rozwiązywanie problemu od włączenia SSHD na serwerze w trybie debug poprzez dodanie do /etc/ssh/sshd_config wpisu
LogLevel DEBUG
i zrestartowanie usługi
service sshd restart
A po stronie klienta użyć sftp z opcją -v lub -vv
sftp -v -o "IdentityFile=/sciezka/do/klucza/prywatnego" copy@10.7.18.2 sftp -vv -o "IdentityFile=/sciezka/do/klucza/prywatnego" copy@10.7.18.2
Po stronie serwera logi czytać można wykorzystując taila
tail -fn0 /var/log/secure