För att konfa pam_mysql läs autentisering med pam_mysql i rhel6.
Mitt mål var att lägga till SFTP till en befintlig FTP-server, därav började jag med guiden ovan. Så jag ville även använda samma användardatabas i MySQL som vsftpd gör i den guiden.
Jag valde att göra all konfiguration i en separat OpenSSH process för att undvika att slutanvändare loggade in på den administrativa OpenSSH-servern som jag använder.
Samtidigt vill du kunna använda normal patchhantering via yum och därför var det bäst att skapa en symlänk till sshd binären istället för att duplicera den tjänsten på något annat sätt.
Först länka /usr/sbin/sshd
till /usr/sbin/chroot_sshd
, detta leder till att PAM-tjänstenamnet byts till chroot_sshd så man slipper skapa en röra i /etc/pam.d/sshd
.
sudo ln /usr/sbin/sshd /usr/sbin/chroot_sshd
Skapa sedan en egen konfigurationskatalog för Chrootad OpenSSH.
sudo mkdir /etc/chroot_sshd
Kopiera moduli-filen och skapa host-nycklar.
sudo cp /etc/sshd/moduli /etc/chroot_ssh/moduli sudo ssh-keygen -N "" -t dsa -f /etc/chroot_ssh/ssh_host_dsa_key sudo ssh-keygen -N "" -t ecdsa -f /etc/chroot_ssh/ssh_host_ecdsa_key
Skapa /etc/chroot_ssh/sshd_config
.
AllowGroups sftpusers Protocol 2 HostKey /etc/chroot_ssh/ssh_host_dsa_key HostKey /etc/chroot_ssh/ssh_host_ecdsa_key Port 1022 PermitRootLogin no PasswordAuthentication yes ChallengeResponseAuthentication no GSSAPIAuthentication no GSSAPICleanupCredentials no LoginGraceTime 60 MACs hmac-sha2-512,hmac-sha2-256 Ciphers aes256-cbc,aes256-ctr PrintMotd no AuthorizedKeysFile .ssh/authorized_keys UsePAM yes #Banner /etc/chroot_ssh/ssh_banner ChrootDirectory /var/sftp/%u ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no PermitTunnel no Subsystem sftp internal-sftp
Redigera filen /etc/pam.d/chroot_sshd
med följande information. Detta är i princip exakt samma som vsftpd använder i den förra guiden.
session optional pam_keyinit.so force revoke auth required pam_mysql.so config_file=/etc/pam_mysql.conf account required pam_mysql.so config_file=/etc/pam_mysql.conf
Vsftpd har alla sina hemkataloger i /home
. Jag kan tyvärr inte använda dem direkt om jag vill chroota mina SFTP-användare.
Så vi skapar /var/sftp
som ny hemkatalog. Se ChrootDirectory i sshd-konfigurationen ovan.
sudo mkdir /var/sftp sudo chown -R root:root /var/sftp
Sedan måste varje användare ha en egen katalog under /var/sftp
och den katalogen måste ägas av root:root.
Exempel:
sudo mkdir /var/sftp/luser sudo chown -R root:root /var/sftp/luser
Till sist, för att användarna ska ha tillgång till sina hemkataloger måste de monteras in under deras nya hemkatalog i /var/sftp
.
sudo mount --bind /home/luser /var/sftp/luser/ftp_home
Lite omständig process att göra för många användare men nödvändigt för säkerheten.
Processen ovan kan automatiseras något med pam_exec.so. Lägger till följande rad i min /etc/pam.d/chroot_sshd
fil som nämns ovan.
auth required pam_exec.so log=/var/log/pam_exec.log /usr/local/sbin/bootstrap_sftp.bash
Skriptet kan se ut så här.
Observera att tyvärr kunde jag inte använda autofs här på grund av en konflikt med SElinux. Det kanske går att lösa med en policyändring men i princip så ändrar autofs-tjänsten kontext på alla kataloger den ska arbeta mot, som t.ex. /var/sftp i detta fallet. Kontext autofs_t tillåter inte ens root att skapa nya filer där.
Kör man RHEL6 som jag gjorde kan det vara frestande att skapa ett upstart-jobb för sin chroot_sshd men gör inte det eftersom upstart körs på RHEL6 under system_u:system_r vilket betyder att den startar din chroot_sshd med samma selinux kontext och då kommer den sshd-processen inte lyssna på vissa policys som krävs för att kunna ansluta till MySQL.
Så jag kopierade istället /etc/init.d/sshd
till /etc/init.d/chroot_sshd
och tog bort lite onödiga saker som att skapa host-nycklar. Se den här på github.
Sen starta tjänsten.
sudo chkconfig chroot_sshd on sudo service chroot_sshd start
Vill du verkligen använda port 1022 som jag skriver i exempelkonfigurationen så behöver SElinux konfas för det.
sudo semanage port -a -t ssh_port_t -p tcp 1022
Det finns inget bra skydd mot MITM-attacker med SFTP så en mitigering kan vara att använda SSHFP-inlägg i DNS, tillsammans med DNSSEC helst.
Här är ett skript på gist som kan användas för att generera SSHFP-inlägg som du sedan lägger in i din DNS.