Configurei um servidor SFTP no CentOS seguindoeste documento. Minha intenção é proibir o login no console para os novos usuários ( user1
, user2
), que pertencem ao sftpusers
grupo, mas ainda podem efetuar login em suas respectivas sftp
pastas.
Além disso, quero usar as mesmas chaves usadas pelo usuário CentOS (que pode fazer login no console e sftp
sem problemas). Para fazer isso, copiei a .ssh
pasta do usuário CentOS para as pastas user1
e user2
home, mudando a propriedade para os usuários e 700
para a .ssh
pasta e 600
para authorized_keys
o arquivo.
Mesmo assim, continuo recebendo a mensagem Server refused our key
. A chave usada pelo usuário CentOS é como uma chave mestra em todos os servidores, por isso quero reutilizar essa chave para os novos usuários.
Como posso conseguir essa configuração?
ATUALIZAR
Depois de gerar chaves para cada usuário, ambos os usuários podem acessar o servidor remotamente com suas chaves privadas, mas quando eu ativo a seguinte configuração nas /etc/ssh/sshd_config
permissões são negadas usando o sftp
comando.
Configuração SSHD
Match Group sftpusers #Or you could replace Group with User and specify a different configuration for each user
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
ChrootDirectory /path/to/shared_folder/%u # %h the path to upload the files
ForceCommand internal-sftp
Mensagem do shell
packet_write_wait: Connection to IPSERVER port 22: Broken pipe
Couldn't read packet: Connection reset by peer
Responder1
A atualização apresenta um problema diferente da pergunta original. Parece que o problema original não é mais um problema. Estou abordando a atualização.
Omanuallê:
ChrootDirectory
Especifica o nome do caminho de um diretóriochroot(2)
após a autenticação. Na inicialização da sessão,sshd(8)
verifica se todos os componentes do nome do caminho são diretórios de propriedade da raiz que não podem ser gravados por nenhum outro usuário ou grupo.
Meus testes indicam que se esta condição não for satisfeita, ocorrerá Broken pipe
ao tentar fazer login com sftp
.
No seu caso, o nome do caminho é /path/to/shared_folder/%u
. Nota %u
(após a expansão) étambémUm componente; portanto, deve ser "de propriedade do root e não gravável por qualquer outro usuário ou grupo". Você deve corrigir a propriedade e as permissões. Então, obviamente, o usuário não poderá gravar no diretório. Qualquer que seja o nome do caminho usado ChrootDirectory
, o usuário não poderá escrever nele (a menos que o usuário seja root). Em outras palavras, o usuário não poderá escrever /
no ambiente chroot. Para permitir a escrita, você precisa de um subdiretório. Existem algumas maneiras de lidar com isso.
Usando diretórios iniciais em um diretório chroot comum.
O manual também afirma:
Após o
chroot
,sshd(8)
altera o diretório de trabalho para o diretório inicial do usuário.Presumo que os diretórios iniciais sejam como
/home/user1
,/home/user2
etc. por padrão. Isso sugere o seguinte cenário:Configure o servidor para fazer chroot
/path/to/shared_folder
(não%u
):ChrootDirectory /path/to/shared_folder
Replique a estrutura de diretórios relevante (
/path/to/shared_folder/home/user1
etc.).- Satisfaça a condição
path
parato
eshared_folder
. - Faça com que a propriedade e as permissões sejam
home
como são para o arquivo/home
. - Faça com que a propriedade e as permissões dos diretórios internos
home
sejam iguais às dos diretórios em/home
.
Com esta configuração será colocado
sftp
automaticamente após a autenticação, mas eles verão isso como devido a .user1
/path/to/shared_folder/home/user1
/home/user1
chroot
Usando diretórios personalizados em um diretório chroot comum.
Com
ForceCommand internal-sftp
você pode especificar o diretório inicial (internal-sftp
suporta o mesmo conjunto de opções quesftp-server
). Assim:ChrootDirectory /path/to/shared_folder ForceCommand internal-sftp -d /home/%u
para garantir que
sftp
os usuários usarão/path/to/shared_folder/home/…
independentemente de seus diretórios iniciais formais no sistema operacional. Ou assim:ChrootDirectory /path/to/shared_folder ForceCommand internal-sftp -d /%u
para simplificar caminhos e se livrar disso
home
no meio. Dessa forma,user1
você verá que eles estão logados/user1
após fazer login comsftp
. Neste caso,shared_folder
deve conter diretamente as pastas do usuário (nãohome
).Usar pelo menos um subdiretório em um diretório chroot específico do usuário.
As soluções acima permitem que os usuários naveguem nos diretórios uns dos outros. Um usuário poderá conceder ou negar acesso aos
chmod
seus arquivos (sftp
suportes ).chmod
Você usou
%u
withChrootDirectory
, então provavelmente deseja criar diretórios chroot separados. Nesse caso, faça o que você fez:ChrootDirectory /path/to/shared_folder/%u
e definir a propriedade e as permissões de cada componente (incluindo o que
%u
se expande) para satisfazer a condição. A menos que se trate de acesso somente leitura, você precisa de pelo menos um subdiretório que possa ser gravado pelo usuário. Poucas possibilidades:- replicar o caminho para o diretório inicial do usuário, conforme definido no sistema operacional;
- forçando
/home/%u
comForceCommand internal-sftp -d /home/%u
; - forçando
/%u
comForceCommand internal-sftp -d /%u
; - usando um nome de subdiretório fixo, por exemplo
ForceCommand internal-sftp -d /files
.
Em cada caso, você precisa preparar a estrutura de diretórios dentro do arquivo
/path/to/shared_folder
. Por exemplo, se você quiser forçar/home/user1
,user1
o caminho relevante será:/path/to/shared_folder/user1/home/user1
onde
path
,to
,shared_folder
e (o primeiro)user1
satisfazem a condição,home
simula/home
e (o segundo)user1
pode ser gravado pelo usuário.
Abordagens mais flexíveis são possíveis. Por exemplo, você pode ter um diretório chroot comum para user1
e user2
, mas diferente para user3
.
Diretório chroot comum ou não, pessoalmente eu faria os subdiretórios da maneira menos surpreendente, para que qualquer usuário se encontre em um diretório que espera. Depois de digitar pwd
, sftp
eles deverão ver algo como /home/user1
. Acho outras possibilidades ( /user1
, /files
) um tanto surpreendentes.