Ative o acesso ao shell SSH mas desative o acesso SFTP

18

Eu pesquisei uma resposta viável para essa pergunta, e a maioria das respostas inclui conselhos sobre por que não fazer isso. No entanto, aqui está o cenário e o que o torna necessário:

Eu tenho um aplicativo de console, e no profile.profile de cada usuário, há um comando de inicialização para o aplicativo e, diretamente após o comando que o inicia, há um comando "exit", que os desconecta do sistema. Eu só quero que eles possam acessar este aplicativo de console através da interface fornecida por ele. Na inicialização, o aplicativo apresenta ao usuário uma lista de clientes que podem ser acessados por meio do aplicativo, com cada cliente tendo seu próprio diretório de dados. Os usuários recebem acesso apenas aos clientes para os quais precisarão acessar.

Agora aqui está o problema: Se eu der acesso ao SSH, eles também poderão fazer o login usando um cliente SFTP, o que lhes dará acesso direto aos diretórios de dados do aplicativo, o que é MUITO indesejável, já que também lhes dará acesso aos diretórios de dados aos quais eles não devem ter acesso.

Isso foi uma coisa tão simples de se fazer ao usar uma combinação de telnet / FTP, mas agora que quero fornecer aos usuários acesso de qualquer lugar na Internet, não consegui encontrar uma maneira de excluí-los. SFTP, enquanto ainda permite acesso ao shell onde eles podem executar o aplicativo.

    
por sosaisapunk 19.12.2014 / 22:26

4 respostas

21

Editar:

Caso não seja óbvio, a seguinte resposta não pretende ser um método seguro de impedir que o SFTP seja usado por qualquer pessoa com acesso shell ao servidor. É apenas uma resposta que explica como desativá-lo da visibilidade externa. Para uma discussão sobre segurança em nível de usuário, veja as respostas de @cpast e @Aleksi Torhamo. Se a segurança é seu foco, essa resposta não é a correta. Se a visibilidade do serviço é o seu foco, então esta é a sua resposta.

Agora continuamos com a resposta original:

Comente o suporte sftp no sshd_config (e, é claro, reinicie o sshd ):

#Subsystem sftp /usr/lib/openssh/sftp-server

    
por 19.12.2014 / 22:30
28

Como outros já mencionaram, a desativação de sftp não é nem de longe suficiente - um usuário com acesso ssh irrestrito pode visualizar qualquer arquivo que sua conta tenha permissão para exibir, modificar qualquer coisa que tenha permissão para modificar e baixe facilmente qualquer coisa que possa ler em sua própria máquina. A única maneira de impedi-los de fazer isso é restringir o acesso deles. Também não é ideal confiar em .profile para restringir usuários, já que não é para isso (Edit: Como Aleksi menciona em sua resposta, é de fato trivial ignorar .profile ; a coisa sobre .profile é que é por conveniência, não por segurança, por isso não se destina a restringir o usuário. Use coisas projetadas para segurança, como as descritas abaixo, para fornecer segurança).

Existem duas maneiras básicas de fazer isso: você pode restringi-las por meio de permissões de arquivos ou forçá-las a executar apenas o aplicativo de console. A segunda maneira é melhor: atribuir usuários que devem ser restritos ao aplicativo de console a um grupo (por exemplo, customers ); em seguida, em sshd_config , adicione as seguintes linhas:

Match Group customers
ForceCommand /path/to/app

O que isso faz é fazer com que todas as conexões dos usuários desse grupo abram o aplicativo de console; eles não podem iniciar qualquer outra coisa, incluindo a ferramenta de servidor sftp . Isso também os impede de fazer qualquer coisa else com o sistema, e ao contrário de .profile , faz isso usando o próprio servidor SSH ( .profile os restringe no shell, ForceCommand também evita fazer outras coisas isso não envolve iniciar um shell). Também ao contrário de .profile , isso é projetado como uma coisa de segurança; ele é feito especificamente para resistir a um usuário mal-intencionado evitando-o.

A alternativa (provavelmente inferior) envolveria a criação de um novo usuário para executar o aplicativo do console. Você restringiria os diretórios de dados a esse usuário, definiria o aplicativo de console de propriedade daquele usuário e definiria u+s no programa. Este é o setuid bit; Isso significa que alguém que executa o programa de console faz isso com as permissões do proprietário do programa. Dessa forma, o usuário não tem acesso aos diretórios, eles apenas o fazem através do programa. No entanto, você provavelmente deve usar apenas ForceCommand , pois isso restringe o acesso all a "apenas executar este programa".

    
por 20.12.2014 / 07:46
15

Não tente fazer isso com .profile , pois não oferece segurança alguma e restringe exatamente nada!

Não importa o que você coloca em .profile , já que você pode ignorá-lo simplesmente dando um comando para rodar na linha de comando ssh, assim: ssh user@host command . Você ainda pode obter acesso normal ao shell fazendo ssh -t user@host bash .

Desativar o subsistema sftp, como mencionado em outra resposta, não ajuda em nada. Os subsistemas são essencialmente aliases para comandos, e você ainda pode usar o sftp normalmente fazendo sftp -s /path/to/sftp-executable user@host .

Como cpast e alguns comentaristas disseram, você deve usar os mecanismos apropriados para restringir o acesso. Isto é,

  • Use ForceCommand em sshd_config
  • Use o login sem senha e command="..." em .ssh/authorized_keys
  • Altere o shell do usuário para algo que restrinja o que o usuário pode fazer

Notas:

  • command="..." aplica-se apenas a uma chave, por isso não restringe o login do ssh para o usuário usando uma senha ou outra chave
  • Você também pode querer restringir o encaminhamento de porta, etc. (encaminhamento de porta, encaminhamento x11, encaminhamento de agente e alocação pty são os que eu ouvi falar)
    • AllowTcpForwarding etc. em sshd_config
    • no-port-forwarding etc. em .ssh/authorized_keys
  • Se você tem outros daemons (como o FTP) em execução, você deve verificar se eles não permitem que o usuário entre (Alguns daemons tomam essa decisão com base no shell do usuário, então se você alterar isso, você pode querer verifique isso)
  • Você pode alterar o shell do usuário para um script que faz o que você deseja; ele é executado sem argumentos ou como script -c 'command-the-user-wanted-to-run'
  • Tanto ForceCommand como command="..." executam o comando através do shell do usuário, portanto, eles não funcionam se o shell do usuário estiver configurado como, por exemplo. /bin/false ou /sbin/nologin

Aviso: Eu não sou especialista no assunto, então, enquanto eu posso dizer que a coisa de .profile não é segura, eu não posso prometer que não há alguma "pegadinha" com os outros métodos que eu não faço saber sobre. Eles estão seguros, tanto quanto eu sei, mas eu não seria a primeira pessoa a estar errada na internet.

    
por 21.12.2014 / 11:10
1

É possível ativar o SSH e desativar o SFTP globalmente e por usuário / grupo.

Eu pessoalmente preciso disso porque quero dar acesso a alguns repositórios git sobre SSH, e eu gostaria de desativar os sistemas que não são necessários. Nesse caso, o SFTP não é necessário.

Globalmente

Você pode desativar o SFTP para todos os usuários de várias maneiras.

O subsistema ausente

O daemon SFTP usado pelo SSH pode ser configurado através da palavra-chave Subsystem . Do manual sshd_config(5) :

Subsystem
        Configures an external subsystem (e.g. file transfer daemon).
        Arguments should be a subsystem name and a command (with optional
        arguments) to execute upon subsystem request.

        The command sftp-server(8) implements the “sftp” file transfer
        subsystem.

        Alternately the name “internal-sftp” implements an in-process
        “sftp” server.  This may simplify configurations using
        ChrootDirectory to force a different filesystem root on clients.

        By default no subsystems are defined.

A última linha sugere que deve ser suficiente não definir nenhum subsistema para "sftp".

Uma falsa mentira

Você também pode desabilitar o SFTP configurando o daemon SFTP usado pelo SSH para algo inutilizável. Por exemplo, configure o subsistema "sftp" para /bin/false :

Subsystem sftp /bin/false

Quando algo tentaria efetuar login via SFTP, o daemon SSH tentaria gerar o "daemon sftp" /bin/false . O programa /bin/false faz apenas uma coisa, e isso é retornar um código de erro. A tentativa de conexão SFTP é efetivamente negado.

Por usuário / grupo

Também é possível desativar o SFTP por usuário, grupo ou alguns outros critérios.

Isso não funciona se você quiser que seu usuário receba um prompt de shell regular. Nor isso faz sentido, já que você pode contornar a maioria das coisas se tiver acesso ao shell. Ele só funcionará se você quiser apenas dar acesso a um programa específico.

Correspondente

Para corresponder a um conjunto de usuários, você pode configurar o SSH com a palavra-chave Match . De o manual sshd_config(5) :

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).

        ...

Alguns exemplos:

  • Match User eva corresponde ao usuário "eva"
  • Match User stephen,maria corresponde aos usuários "stephen" e "maria"
  • Match Group wheel,adams,simpsons corresponde à "roda", "adams", "simpsons" grupos

Se você quiser mais informações, há cargas no manual sshd_config(5) .

Comando forçado

Normalmente, você obtém o shell de login do usuário quando se conecta via SSH, mas o SSH pode ser configurado para forçar um determinado comando. O comando é forçado para qualquer SSH conexão, incluindo SFTP e, portanto, você pode ter a opção de forçar o comando que você quer.

O comando forçar pode ser configurado com a palavra-chave ForceCommand . De sshd_config(5) manual:

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”.

Assim, você pode forçar o comando restrito desejado usando ForceCommand <your command> . Por exemplo:

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

Exemplo

No meu caso, onde eu quero dar acesso ao git, eu só preciso que o usuário tenha acesso codificar%. Esta é a seção que desabilita o SFTP para meus usuários do git, junto com algumas opções de segurança:

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
    
por 28.11.2016 / 15:57