Questão 1
Minha pergunta é: como restringir o comando apenas a essa transferência SFTP na chave pública gerada?
Existem 2 métodos para fazer isso.
1. - Restringindo através do sshd
Este método envolve a configuração do recurso SFTP no seu daemon SSH sshd
,. Isso é controlado através do /etc/ssh/sshd_config
arquivo de configuração. OBSERVAÇÃO: Isso restringirá o usuário, backup
que só pode receber SFTP no servidor.
# /etc/ssh/sshd_config
Subsystem sftp internal-sftp
## You want to put only certain users (i.e users who belongs to sftpusers
## group) in the chroot jail environment. Add the following lines at the end
## of /etc/ssh/sshd_config
Match User backup
ForceCommand internal-sftp
2. - Restringindo por meio de teclas autorizadas
Este método não envolve nenhuma alteração no sshd_config
arquivo. Você pode limitar um usuário + uma chave SSH a um único comando através do command=
recurso que você já mencionou na sua pergunta. O truque está em qual comando você inclui. Você pode colocar o servidor SFTP nessa command=
linha, que tem o mesmo efeito que configurar o servidor SFTP no seu sshd_config
arquivo.
# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host
NOTA: se o usuário tiver acesso de gravação ~/.ssh/authorized_keys
, ele poderá lê-lo e / ou modificá-lo. Por exemplo, eles poderiam baixá-lo, editá-lo e reenviá-lo, retirando o arquivo commmand=...
, concedendo-lhe acesso irrestrito ao comando, incluindo o shell. Se o usuário tiver acesso de gravação ~/.ssh
, ele também poderá simplesmente desvincular e recriar o arquivo, ou chmod
ele para acesso de gravação. Existem muitas soluções possíveis, como guardar os ~/.ssh/authorized_keys
arquivos em um local não gravável pelo usuário, como:
Match Group sftponly
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
Questão 2
E como estou com um endereço IP dinâmico, como supero o problema de "host conhecido ausente" toda vez que meu IP é alterado?
Isso é mais complicado, mas possível usando o from=
recurso dentro do authorized_keys
arquivo também. Aqui estamos limitando o acesso apenas do host somehost.dyndns.org
,.
from = "somehost.dyndns.org", comando = "/ usr / libexec / openssh / sftp-server", encaminhamento sem porta, encaminhamento X11, encaminhamento sem agente, sem-pty ssh-dss AAAAC8ghi9ldw == backup @ host
As configurações adicionais após o command=
são igualmente importantes, pois limitarão ainda mais o uso da chave SSH.
discriminação de recursos
from='hostname1,hostname2,''
- Restringe o acesso dos padrões de IP ou nome de host especificados
command='command'
- Executa o comando especificado após a autenticação
no-pty
- Não aloca um pty (não permite logon interativo)
no-port-forwarding
- Não permite encaminhamento de porta
no-X11-forwarding
- o usuário não poderá remover as GUIs da tela X11
no-agent-forwarding
- o usuário não poderá encaminhar esse host para outros hosts internos
Para se livrar da mensagem sobre os "hosts conhecidos ausentes", você pode adicionar esta opção SSH ao cliente quando ele se conectar da seguinte maneira:
$ ssh -o StrictHostKeyChecking=no ....
Consulte a página do manual ssh_config
para obter detalhes completos sobre essa opção.
Restringindo o shell do usuário
Para as duas soluções acima, você provavelmente desejará bloquear o backup
usuário limitando também o shell do usuário no /etc/passwd
arquivo. Normalmente, você deseja defini-lo como scponly
, mas há outras opções para isso também. Veja estas perguntas e respostas da U&L intituladas: " Você precisa de um shell para o SCP? " Para saber como fazer isso.
O uso de /sbin/nologin
também pode ser usado se você optar por usar o recurso chroot, sshd_config
conforme descrito no item 1 acima. No entanto, se você optar por usar o método descrito em # 2 , provavelmente precisará usar scponly
ou algo mais para o shell do usuário /etc/passwd
.
BÔNUS - Estendendo o nº 2 acima
Se você precisar expor um conjunto de comandos para esse usuário, também poderá fazê-lo. Crie um script assim /home/backup/commands.sh
:
#!/bin/sh
case $SSH_ORIGINAL_COMMAND in
"diskspace")
df -h
;;
"dirlist")
ls -1
;;
"apache_restart")
/etc/init.d/apache restart
;;
*)
echo "Unknown command"
esac
Você então configura o authorized_keys
arquivo da seguinte maneira:
command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host
O backup
usuário pode então executar estes comandos da seguinte maneira:
# diskspace
$ ssh -q user@remote_host diskspace
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/dev-root 39G 2.2G 35G 6% /
# dirlist
$ ssh -q remote_host dirlist
commands.sh
dump.sql
Referências