Come disabilitare sftp per alcuni utenti, ma mantenere abilitato ssh?


12

Il mio progetto ha bisogno che io disabiliti sftp per alcuni utenti, ma quegli utenti devono comunque connettersi tramite ssh. Qualcuno sa come implementarlo?

Ho visto dei suggerimenti su come cambiare il file /etc/ssh/sshd_config, ma non sono sicuro di cosa cambiare.


L'unico modo in cui potrei immaginare di fare questo sarebbe usare una politica MLS in SELinux e limitare esattamente a quali file, directory e socket una persona può accedere, eseguire, ecc. Lo farei in combinazione con una politica iptables altamente restrittiva che usa il modulo ownerper l'accesso in uscita. Questo presuppone che verrai testato con la penna da una squadra rossa. Se tutti gli utenti che accedono al tuo sistema obbediscono sempre alle regole e non hanno mai avuto cattive intenzioni, il mio approccio sarebbe pesante e troppo complesso.
Aaron,

Risposte:


7

In generale, ciò è una cattiva pratica di sicurezza per motivi che altri hanno elencato. Tuttavia, il punto del tuo incarico, penso, è di insegnarti che puoi avere sezioni di configurazione condizionate basate su vari criteri.

Il modo per farlo è usare un Matchblocco condizionale *.

Match User bob
Subsystem   sftp  /bin/false

Vedi sshd_config(5)sotto la Matchsezione per ulteriori informazioni e la corrispondenza su Group.

* C'è più di un modo per farlo.


7
Non funziona per me. Errore: la direttiva "Sottosistema" non è consentita all'interno di un blocco Match
chrw

Risposta errata perché il sottosistema non è consentito nel blocco Match
mikep

6

Questo non ha alcun senso, è la sicurezza attraverso l'oscurità inutile. Qualsiasi utente che può SSH sarà in grado di trasferire qualsiasi file che è in grado di leggere tramite la sessione SSH. Sarai anche in grado di scrivere, se hai i permessi per farlo.

Come ad esempio, puoi scaricare / etc / passwd tramite ssh usando il seguente metodo (nessuna sessione scp / sftp richiesta): ssh foo@bar.com "cat / etc / passwd"> passwdcopy

Se riesci a vederlo sullo schermo tramite SSH, puoi facilmente copiarlo come file.

L'unico modo in cui ciò avrebbe senso è se si dispone di una shell con restrizioni personalizzate che applica una politica di sicurezza.

Tuttavia, l'inverso di ciò ha senso (disabilitando la shell ssh ma abilitando scp / sftp abilitato) perché non è possibile eseguire comandi arbitrari tramite sftp / scp che è possibile tramite una shell ssh.

PS: suppongo che la shell SSH che stai concedendo sia una shell standard che consente l'esecuzione arbitraria. In caso contrario, vedere questo: Come disabilitare il sottosistema sftp per un utente o un gruppo specifico? e dai un'occhiata all'opzione di configurazione del sottosistema di sshd_config.


4
Match Group nosft
Subsystem   sftp  /bin/false

Preferisco usare un gruppo per questo.

È utile in combinazione con utenti con shell limitate. A volte concedo l'accesso ssh a un client in modo che possano accedere a un dump sql del loro database impostando la shell su uno script che scarica i loro dati. Anche tagliarli da SCP sembra essere un'idea intelligente. Non hanno accesso alla corsa catper trasferire un file su ssh.


3
Directive 'Subsystem' is not allowed within a Match block
Patryk,

Risposta errata perché il sottosistema non è consentito nel blocco Match
mikep

4

È possibile abilitare SFTP a livello globale e disabilitare SFTP solo per alcuni utenti.

Questo non funziona se si desidera che l'utente riceva un normale prompt della shell. Né ha senso, dato che potresti aggirare la maggior parte delle cose se hai accesso alla shell. Funzionerà solo se si desidera dare accesso a un programma specifico.

Personalmente ne ho bisogno perché voglio dare accesso ad alcuni repository git su SSH e mi piace disabilitare i sistemi che non sono necessari. In tal caso, SFTP non è necessario.

accoppiamento

Per abbinare un set di utenti, è possibile configurare SSH con la Matchparola chiave. Dal sshd_config(5)manuale:

Match
        ...

        The arguments to Match are one or more criteria-pattern pairs or the
        single token All which matches all criteria.  The available criteria
        are User, Group, Host, LocalAddress, LocalPort, and Address.  The
        match patterns may consist of single entries or comma-separated
        lists and may use the wildcard and negation operators described in
        the PATTERNS section of ssh_config(5).

        ...

Un paio di esempi:

  • Match User eva corrisponde all'utente "eva"
  • Match User stephen,maria corrisponde agli utenti "stephen" e "maria"
  • Match Group wheel,adams,simpsons corrisponde ai gruppi "ruota", "adams", "simpsons"

Se vuoi maggiori informazioni, ci sono molti carichi nel sshd_config(5)manuale.

Comando forzato

Normalmente si ottiene la shell di accesso dell'utente quando ci si connette tramite SSH, ma SSH può essere configurato per forzare un determinato comando. Il comando è forzato per qualsiasi connessione SSH, incluso SFTP, e quindi potresti avere la possibilità di forzare il comando che desideri.

Il comando per forzare può essere configurato con la ForceCommandparola chiave. Dal sshd_config(5)manuale:

ForceCommand
        Forces the execution of the command specified by ForceCommand,
        ignoring any command supplied by the client and ~/.ssh/rc if
        present.  The command is invoked by using the user's login shell
        with the -c option.  This applies to shell, command, or subsystem
        execution.  It is most useful inside a Match block.  The command
        originally supplied by the client is available in the
        SSH_ORIGINAL_COMMAND environment variable.  Specifying a command of
        “internal-sftp” will force the use of an in-process sftp server that
        requires no support files when used with ChrootDirectory.  The
        default is “none”.

Quindi puoi forzare il comando vincolato che desideri utilizzare ForceCommand <your command>. Per esempio:

Match User kim
        ForceCommand echo 'successful login man, congrats'

Esempio

Nel mio caso in cui voglio dare accesso a Git, ho solo bisogno che l'utente abbia accesso git-shell. Questa è la sezione che disabilita SFTP per i miei utenti git, insieme ad alcune opzioni di sicurezza:

Match Group git

        # have to do this instead of setting the login shell to `git-shell`,
        # to disable SFTP
        ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

        # disable stuff we don't need
        AllowAgentForwarding no
        AllowTcpForwarding no
        AllowStreamLocalForwarding no
        PermitOpen none
        PermitTunnel no
        PermitTTY no
        X11Forwarding no

1
Questo non risponde alla domanda del PO, ma è stato molto utile per me raggiungere ciò che voglio ottenere nel mio caso d'uso
Kidburla,

Non sono d'accordo La domanda di OP è "Come disabilitare sftp per alcuni utenti, ma mantenere abilitato ssh?", E questa risposta spiega un modo per farlo. Sono contento che l'abbia trovato utile comunque!
aude

Per tua stessa ammissione "non funziona se desideri che il tuo utente riceva un prompt di shell regolare". quindi questo non soddisfa i requisiti del PO di "mantenere abilitato ssh"
Kidburla,

È un buon punto. Immagino di aver fatto i conti con questa soluzione grazie a "Né ha senso, dato che potresti eludere la maggior parte delle cose se avessi accesso alla shell". Ma non ho trovato il modo di rispondere esattamente a ciò che chiede l'OP, sono d'accordo ora.
aude,

Ecco una versione più completa di questa risposta: serverfault.com/a/817482
aude

1
Match User bob
MaxSessions 0

Testato e funzionante su CentOS 6.6. Si noti che il sottosistema non è consentito con Match almeno nelle versioni CentOS più recenti. La manpage di sshd_config elenca le parole chiave limitate consentite con la condizione Match.


0

Puoi guardare scponly per fare il contrario, consentire solo scp / sftp ma nessun accesso alla shell.

Sono d'accordo con @Nathan sopra, questo non ha molto senso. Se non sei pronto, prova a modificare il tuo file / etc / ssh / sshd_config e a rimuovere / commentare la seguente riga:

Sottosistema sftp / usr / libexec / openssh / sftp-server


0

non fornire home directory per l'utente

usermod username -d /bin/false

Cambia sottosistema sftp / usr / libexec / openssh / sftp-server nel file / etc / ssh / sshd_config in sottosistema sftp / dev / null / usr / libexec / openssh / sftp-server

Quindi riavviare ssh

service ssh restart

funziona per me, Debian.


-2

Nel ~/authorized_keyconfigurare la chiave utente come segue:

command="/bin/bash" ssh-rsa AAAAB3Nz.........
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.