Procurei uma resposta viável para essa pergunta e a maioria das respostas inclui conselhos sobre por que não fazê-lo. No entanto, aqui está o cenário e o que é necessário:
Eu tenho um aplicativo de console e, no perfil de cada usuário, existe um comando de inicialização para o aplicativo e, diretamente após o comando que o inicia, existe 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 pelo aplicativo, com cada cliente tendo seu próprio diretório de dados. Os usuários têm acesso concedido apenas aos clientes aos quais precisam acessar.
Agora, aqui está o problema: se eu der aos usuários acesso SSH, eles também poderão fazer login usando um cliente SFTP, que lhes dará acesso direto aos diretórios de dados do aplicativo, o que é MUITO indesejável, pois isso também fornecerá eles acessam os diretórios de dados aos quais eles não devem ter acesso.
Isso era uma coisa tão simples de se fazer ao usar uma combinação de telnet / FTP, mas agora que desejo dar aos usuários acesso de qualquer lugar da Internet, não consegui encontrar uma maneira de excluí-los do SFTP, enquanto ainda permitindo que eles acessem o shell onde eles podem executar o aplicativo.
.profile
para isso soa como a solução errada. Acredito que configurar o usuário com um shell alternativo faria muito mais sentido..profile
truque para restringir o acesso, pois é trivial ignorar. (veja minha resposta para detalhes) #Respostas:
Editar:
Caso isso não seja óbvio, a resposta a seguir não pretende ser um método seguro de impedir que o SFTP seja usado por qualquer pessoa com acesso ao servidor. É apenas uma resposta que explica como desativá-lo da visibilidade externa. Para uma discussão sobre segurança no nível do usuário, consulte as respostas de @cpast e @Aleksi Torhamo. Se a segurança é seu foco, esta resposta não é a correta. Se o seu foco é a simples visibilidade do serviço, então esta é sua resposta.
Agora continuamos com a resposta original:
Comente o suporte ao sftp no sshd_config (e, é claro, reinicie
sshd
):#Subsystem sftp /usr/lib/openssh/sftp-server
fonte
Subsystem sftp internal-sftp
Subsystem sftp /usr/libexec/sftp-server
Mas isso fez o truque. Muito obrigadossh user@host command
, pois.profile
não serão executados se você fizer isso e, portanto, seu aplicativo não será iniciado. Eles podem obter acesso total ao shell simplesmente dizendossh -t user@host bash
. Apenas tente e você verá. O subsistema é apenas um alias de comando; se eles pudessem usar o sftp antes, ainda poderão usá-lo - e qualquer outro comando que desejarem. Leia minha resposta abaixo..profile
, pois não se destina à segurança e é facilmente ignorado. Na minha resposta, listei três métodos diferentes de fazê-lo com o ssh. Em resumo, basta mover a chamada do seu aplicativo de.profile
para um script de shell e 1) definir o script de shell como o shell do usuário 2) definir o script de shell como (correspondido corretamente)ForceCommand
emsshd_config
3) alternar para autenticação de chave pública e definir o shell script comocommand
em.ssh/authorized_keys
. (Além disso, você deve usar @ nome para que as pessoas ser notificado das observações)Como outros já mencionaram, a desativação
sftp
não é nem de longe suficiente - um usuário comssh
acesso irrestrito pode visualizar qualquer arquivo que sua conta tenha permissão para visualizar, pode modificar qualquer coisa que tenha permissão para modificar e pode facilmente baixar qualquer coisa que possa ler por conta própria máquina. A única maneira de impedi-los de fazer isso é restringir o acesso deles. Também não é ideal confiar.profile
para restringir os usuários, pois não é para isso (editar: Como Aleksi menciona em sua resposta, é de fato trivial ignorar.profile
; o importante.profile
é que é por conveniência, não por segurança, por isso não é para restringir o usuário.Use itens projetados para segurança, como os itens abaixo, para fornecer segurança).Há duas maneiras básicas de fazer isso: você pode restringi-las por meio de permissões de arquivo ou forçá-las a executar apenas seu aplicativo de console. A segunda maneira é melhor: atribua usuários que devem ser restritos ao aplicativo do console a um grupo (por exemplo
customers
); em seguida,sshd_config
adicione as seguintes linhas:O que isso faz é permitir que todas as conexões dos usuários desse grupo abram o aplicativo do console; eles não podem iniciar mais nada, incluindo a
sftp
ferramenta de servidor. Isso também os impede de fazer qualquer outra coisa com o sistema e, ao contrário.profile
, o faz usando o próprio servidor SSH (.profile
restringe-os no shell,ForceCommand
também impede que outras coisas que não envolvam iniciar um shell). Também.profile
, diferentemente , isso é projetado como uma coisa de segurança; foi feito especificamente para resistir a um usuário mal-intencionado que evita isso.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, configuraria o aplicativo de console pertencente a esse usuário e
u+s
o programa. Essa é a partesetuid
; isso significa que alguém que executa o programa do console faz isso com as permissões do proprietário do programa. Dessa forma, o próprio usuário não tem acesso aos diretórios, apenas o obtém através do programa. No entanto, você provavelmente deve apenas usarForceCommand
, pois isso restringe todo o acesso a "basta executar este programa".fonte
ForceCommand
não impede o encaminhamento de porta SSH..profile
é mais do que "não ideal"; é facilmente ignorado (veja minha resposta para obter detalhes) e, portanto, não oferece proteção alguma, apenas uma falsa sensação de segurança.Não tente fazer isso com isso,
.profile
porque ele não oferece segurança alguma e restringe exatamente nada!Não importa o que você colocar em
.profile
, desde que você pode ignorá-lo, basta dar um comando para executar na linha de comando ssh, como este:ssh user@host command
. Você ainda pode obter acesso normal ao shell fazendo issossh -t user@host bash
.Desabilitar o subsistema sftp, como mencionado em outra resposta, não ajuda em nada. Os subsistemas são essencialmente apenas aliases de comandos, e você ainda pode usar o sftp normalmente fazendo isso
sftp -s /path/to/sftp-executable user@host
.Como cpast e alguns comentaristas disseram, você deve usar os mecanismos adequados para restringir o acesso. Isso é,
ForceCommand
emsshd_config
command="..."
em.ssh/authorized_keys
Notas:
command="..."
aplica-se apenas a uma chave, por isso não restringe o login ssh para o usuário usando uma senha ou outra chaveAllowTcpForwarding
etc. emsshd_config
no-port-forwarding
etc. em.ssh/authorized_keys
script -c 'command-the-user-wanted-to-run'
ForceCommand
ecommand="..."
executam o comando através do shell do usuário, para que não funcionem se o shell do usuário estiver definido como, por exemplo./bin/false
ou/sbin/nologin
Isenção de responsabilidade: eu não sou especialista no assunto de forma alguma, por isso, enquanto posso dizer que a
.profile
coisa não é segura, não posso prometer que não há "pegadinha" com os outros métodos que não conheço sobre. Eles são seguros até onde eu sei, mas eu não seria a primeira pessoa a estar errada na internet.fonte
ForceCommand
login forçado e sem senha comcommand=
inauthorized_keys
, apesar de já ter sido ignorado antes, é devido a um erro no servidor: ele se destina a ser seguro contra um usuário mal-intencionado, e um usuário que o ignora conta como uma séria vulnerabilidade no servidor SSH (e, portanto, uma correção prioritária). Como você aponta,.profile
é ignorável por design: como não é considerado um recurso de segurança, um usuário que o ignora está perfeitamente bem do ponto de vista do desenvolvedor de shell.ForceCommand
para restringir o acesso, e tinha um daemon que apenas escuta conexões localmente e não executa autenticação, o usuário do ssh ainda pode acessar o daemon. Os recursos que listei são os que, por exemplo. As soluções de hospedagem git geralmente desabilitam, e eu também não vi nenhuma "aparência de má aparência" nas páginas de manual, mas também não encontrei nenhum tipo de documento oficial "é assim que você usa comForceCommand
segurança".~/.profile
usuário é editável e não é útil para segurança, mas você poderia tornar a técnica do cpast significativa colocando-a em/etc/profile
? Você pode verificar o UID para limitá-lo aos usuários certos.ssh user@host
, mas se você diz ao ssh para executar um comando - ie.ssh user@host command
- você não recebe mais um shell de login e os arquivos não são alterados. Portanto, você pode ignorar trivialmente quaisquer restrições que alguém tentou criar com os arquivos, simplesmente fornecendo um argumento extra ao ssh..profile
, usasshd_config
e deve ser seguro. Ele apenas menciona.profile
como um método que você não deve usar para fazer isso.É possível ativar o SSH e desativar o SFTP globalmente e por usuário / grupo.
Pessoalmente, preciso disso porque quero dar acesso a alguns repositórios git sobre SSH e gosto de desativar 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
Subsystem
palavra - chave. Dosshd_config(5)
manual:A última linha sugere que deve ser suficiente não definir nenhum subsistema para "sftp".
Uma mentira falsa
Você também pode desativar o SFTP configurando o daemon SFTP usado pelo SSH para algo inutilizável. Por exemplo, configure o subsistema "sftp" para
/bin/false
:Quando algo tentava efetuar login via SFTP, o daemon SSH tentava gerar o "daemon sftp"
/bin/false
. O/bin/false
programa faz apenas uma coisa, e isso é retornar um código de erro. A tentativa de conexão SFTP é efetivamente negada.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ê deseja que o usuário obtenha um prompt de shell regular. Também não faz sentido, pois você pode contornar a maioria das coisas se tiver acesso ao shell. Só funcionará se você quiser dar acesso a um programa específico.
Coincidindo
Para corresponder a um conjunto de usuários, você pode configurar o SSH com a
Match
palavra - chave Dosshd_config(5)
manual: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 aos grupos "roda", "adams", "simpsons"Se você quiser obter mais informações, há muitas cargas no
sshd_config(5)
manual.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 conexão SSH, incluindo SFTP, e, portanto, você pode ter a opção de forçar o comando desejado.
O comando forçar pode ser configurado com a
ForceCommand
palavra - chave Dosshd_config(5)
manual:Assim, você pode forçar o comando restrito que deseja usar
ForceCommand <your command>
. Por exemplo:Exemplo
No meu caso em que desejo conceder acesso ao git, só preciso que o usuário tenha acesso
git-shell
. Esta é a seção que desativa o SFTP para meus usuários git, junto com algumas opções de segurança:fonte