Puncte:3

Configurarea sftp pe Amazon Linux 2 cu chei ssh, segregarea utilizatorilor (sftp vs ssh), diferite porturi și constrângeri ale directorului utilizatorului

drapel pk

TDLR: Am un Catch 22 în care, în funcție de permisiunile din directorul principal al utilizatorului, pot face ca autentificarea SSH să funcționeze sau constrângerile directorului utilizatorului, dar nu ambele.

BTW, chiar vreau să-mi rulez propriul server SFTP. Vă rugăm să nu recomandați să încerc serviciul AWS Transfer sau ceva alternativ. Mulțumiri.

Aici este conținut relevant (modificat din implicit) în /etc/ssh/sshd_config:

Subsistem sftp intern-sftp
Portul 22
Portul 2299
Potriviți grupul sftpusers LocalPort 2299
  ChrootDirectory /sftp-data/%u
  ForceCommand intern-sftp
Potriviți grupul sftpusers LocalPort 22
  DenyGroups sftpusers
Potriviți Grupul LocalPort 2299 *,!sftpusers
  DenyUsers *

Vreau ca portul 22 să funcționeze ca de obicei ssh, dar numai pentru utilizatorii non-sftp. Pentru utilizatorii sftp, în grupul „sftpusers”, vreau ca portul 2299 să funcționeze numai ca sftp, și nu ca ssh. Pentru utilizatorii non-sftpusers, vreau accesul la portul 2299 refuzat.

Ok, deci, am creat un utilizator „user1” cu directorul principal /sftp-data/user1 și shell /sbin/nologin. Am creat /sftp-data/user1/.ssh/authorized_keys și l-am populat cu cheia publică ssh. /sftp-data este deținut de root cu 700 de permisiuni. /sftp-data/user1/.ssh și mai jos sunt deținute de user1, iar /sftp-data/user1/.ssh/authorized_keys are permisiunea 600. Proprietatea/permisiunile /sftp-data/user1 sunt sub semnul întrebării aici. Mai multe mai jos.

Am creat grupul de utilizatori sftpusers și am adăugat user1 la acel grup. Cu toate acestea, utilizatorul ec2 încorporat pe care îl obțineți cu AWS nu este membru al grupului respectiv. Testarea cu ec2-user a funcționat excelent: accesul prin ssh, portul 22 a funcționat ca întotdeauna, dar nu avea acces la portul 2299.

Deci, testarea cu user1 este locul unde a devenit interesant. User1 nu are acces la portul 22 - asta e grozav! Cu user1 deținând /sftp-data/user1, autentificarea cu cheie publică ssh reușește pe portul 2299, dar utilizatorul este imediat deconectat, cu acest mesaj salvat în /var/log/secure:

2 septembrie 19:21:38 ip-192-168-0-25 sshd[10369]: cheie publică acceptată pentru utilizatorul 1 de la <adresa-ip redactată> portul 61110 ssh2: ECDSA SHA256:<adresa-ip redactată>
2 septembrie 19:13:23 ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): sesiune deschisă pentru utilizatorul user1 de (uid=0)
2 septembrie 19:13:23 ip-192-168-0-25 sshd[9803]: fatal: proprietate proastă sau moduri pentru directorul chroot „/sftp-data/user1” [postauth]
2 septembrie 19:13:23 ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): sesiune închisă pentru utilizatorul user1

Sigur, asta are sens. Chroot necesită ca /sftp-data/user1 să fie deținut de root, permisiuni 700. Așadar, faceți acest lucru, iar acum autentificarea sftp (cheie ssh) eșuează.

2 septembrie 19:41:00 ip-192-168-0-25 sshd[11693]: eroare: AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys user1 SHA256:<sha redactat> a eșuat, starea 22

BTW, eic_run_authorized_keys este un wrapper pe care AWS îl pune în jurul autentificării ssh standard pentru a activa AWS Instance Connect.

Pentru credit suplimentar... dacă problema de mai sus nu este suficient de provocatoare, puteți veni cu o schemă în care să pot oferi anumitor utilizatori sftp acces la anumite directoare de proiecte și numai la acelea, fără a crea un grup pentru fiecare proiect? Legătura de la directorul principal al fiecărui utilizator la un director de proiect ar fi minunat.

Informații suplimentare solicitate de @anx:

# getent passwd user1
user1:x:1001:1001::/sftp-data/user1:/sbin/nologin
# namei -l /sftp-data/user1/.ssh/authorized_keys
f: /sftp-data/user1/.ssh/authorized_keys
rădăcină rădăcină dr-xr-xr-x /
drwxr-xr-x root root sftp-data
drwx------ root root user1
drwx------ user1 sftpusers .ssh
-rw------- user1 sftpusers chei_autorizate

Am activat înregistrarea DEBUG pentru sshd. Folosind directiva ChrootDirectory, cu /sftp-data/user1 deținut de root și autentificarea SSH eșuând, văd asta în /var/log/secure:

debug1: Nu s-au putut deschide cheile autorizate „/sftp-data/user1/.ssh/authorized_keys”: Permisiune refuzată

ps îmi arată clar că root rulează procesul sshd.

drapel pk
@anx mulțumesc pentru gânduri. Scriptul eic_run_authorized_keys, de la AWS, încearcă să verifice o cheie în metadatele instanței EC2, pentru a vedea dacă se utilizează EC2 Instance Connect. Acest script este specificat în fișierul sshd_config sub AuthorizedKeysCommand. Pagina de manual de pe aceasta spune: „Dacă o cheie furnizată de AuthorizedKeysCommand nu se autentifică și nu autorizează cu succes utilizatorul, atunci autentificarea cu cheie publică continuă să utilizeze fișierele obișnuite AuthorizedKeysFile”. Deci, eșuează cu starea 22 pe o comandă curl care returnează o stare 401. Apoi, procesul obișnuit cu ~user1/.ssh/authorized_keys merge
drapel pk
Conform sugestiei lui @anx, am creat un caz mai simplu care funcționează. Scenariul de lucru este eliminarea directivei ChrootDirectory din sshd_config și user1 care deține proprietatea /sftp-data/user1. Asta, desigur, nu face ceea ce îmi doresc. Pentru a adăuga în Chroot, root trebuie să dețină /sftp-data/user1, sau se afișează o eroare. Odată ce root deține acel director, autentificarea SSH eșuează.
Michael Hampton avatar
drapel cz
Ce eroare a fost înregistrată de sshd pentru acel set specific de permisiuni?
drapel pk
întrebare actualizată - cu acel detaliu @MichaelHampton
Michael Hampton avatar
drapel cz
ChrootDirectory are nevoie de permisiunea minimă de căutare (`a+x`) pentru ca utilizatorul neprivilegiat să poată coborî în directoare de nivel inferior.
drapel pk
@MichaelHampton ai înțeles. Creați un răspuns dacă doriți. Am citit prea multe despre ceea ce spune pagina de manual despre ChrootDirectory: „La pornirea sesiunii, sshd(8) verifică dacă toate componentele căii sunt directoare deținute de rădăcină, care nu pot fi scrise de niciun alt utilizator sau grup”. Deci, se pare că ceea ce am învățat este că sshd verifică un fișier authorized_keys care poate fi citit ca utilizatorul care încearcă să se autentifice. Mulțumesc mult!
Puncte:3
drapel cz

Ta ChrootDirectory este /sftp-data/user1, care trebuie să fie deținut de root. Si e:

# namei -l /sftp-data/user1/.ssh/authorized_keys
f: /sftp-data/user1/.ssh/authorized_keys
rădăcină rădăcină dr-xr-xr-x /
drwxr-xr-x root root sftp-data
drwx------ root root user1
drwx------ user1 sftpusers .ssh
-rw------- user1 sftpusers chei_autorizate

Cu toate acestea, în acest moment, sshd a schimbat deja utilizatorul în user1 și a renunțat la privilegii, astfel încât user1 nu poate coborî în directoarele de nivel inferior. Pentru a face asta, directorul are nevoie de permisiunea de căutare (a+x).

chmod a+x /sftp-data/user1

Acum user1 poate coborî în subdirectoare și în .ssh directorul ar trebui să fie lizibil.

Puncte:1
drapel ve

Cred că aceasta este în primul rând o problemă cu permisiunile folderului. cred ca /sftp-data/user1/.ssh iar directoarele de mai jos trebuie să fie deținute de utilizator1, dar se pare că sunt deținute de rădăcină. Încercați următoarele ca rădăcină:

Verificați cheia publică /sftp-data/user1/.ssh/authorized_keys este exactă. După aceea, cred că acestea sunt permisiunile pe care este posibil să aveți nevoie să le schimbați:

chmod 700 /sftp-data/user1/.ssh
chmod 600 /sftp-data/user1/.ssh/authorized_keys
chown root: sftpusers /sftp-data
chown -R user1:user1 /sftp-data/user1/.ssh

Reporniți SSH și cred că veți fi bine.

drapel pk
Multumesc pentru raspuns. Din păcate, deja încercasem acele permisiuni. Pentru orice eventualitate, am rulat comenzile sugerate și am găsit același rezultat. Autentificarea SSH eșuează. Mă gândesc, logic, ce ar putea fi diferit de alternativa, în care user1 deține /sftp-data/user1? S-ar putea ca sshd (care rulează ca root) să nu poată accesa cheile autorizate ale utilizatorului deoarece parcurge directoare?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.