No meu /etc/passwd
arquivo, posso ver que o www-data
usuário usado pelo Apache, assim como todos os tipos de usuários do sistema, tem um /usr/sbin/nologin
ou /bin/false
como seu shell de login. Por exemplo, aqui está uma seleção de linhas:
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin games:x:5:60:games:/usr/games:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin syslog:x:101:104::/home/syslog:/bin/false whoopsie:x:109:116::/nonexistent:/bin/false mark:x:1000:1000:mark,,,:/home/mark:/bin/bash
Conseqüentemente, se eu tentar trocar para qualquer um desses usuários (o que às vezes eu gostaria de fazer para verificar meu entendimento de suas permissões e quais provavelmente existem outras razões pelo menos pela metade), falho:
mark@lunchbox:~$ sudo su www-data
This account is currently not available.
mark@lunchbox:~$ sudo su syslog
mark@lunchbox:~$
Obviamente, isso não é muito inconveniente, porque ainda posso iniciar um shell para eles através de um método como este:
mark@lunchbox:~$ sudo -u www-data /bin/bash
www-data@lunchbox:~$
Mas isso me deixa pensando em que objetivo é servido negar a esses usuários um shell de login. Procurando uma explicação na Internet, muitas pessoas afirmam que isso tem algo a ver com segurança, e todos parecem concordar que seria de alguma forma uma má idéia alterar as conchas de login desses usuários. Aqui está uma coleção de citações:
Definir o shell do usuário do Apache para algo não interativo geralmente é uma boa prática de segurança (na verdade, todos os usuários do serviço que não precisam fazer logon interativamente devem ter seu shell definido como algo não interativo).
- https://serverfault.com/a/559315/147556
o shell para o usuário www-data está definido como / usr / sbin / nologin e está definido por uma boa razão.
- https://askubuntu.com/a/486661/119754
[contas do sistema] podem ser falhas de segurança , especialmente se eles tiverem um shell ativado:
Ruim
bin:x:1:1:bin:/bin:/bin/sh
Boa
bin:x:1:1:bin:/bin:/sbin/nologin
- https://unix.stackexchange.com/a/78996/29001
Por motivos de segurança, criei uma conta de usuário sem shell de login para executar o servidor Tomcat:
# groupadd tomcat # useradd -g tomcat -s /usr/sbin/nologin -m -d /home/tomcat tomcat
- http://www.puschitz.com/InstallingTomcat.html
Embora essas postagens estejam em acordo unânime de que não fornecer shell de logon reais aos usuários do sistema é bom para segurança, nenhum deles justifica essa reivindicação e não consigo encontrar uma explicação sobre isso em nenhum lugar.
Contra qual ataque estamos tentando nos proteger, não fornecendo a esses usuários informações reais sobre o login?
Respostas:
Se você der uma olhada na
nologin
página de manual, verá a seguinte descrição.excerto
Portanto, a intenção real
nologin
é justamente para que, quando um usuário tente fazer login com uma conta que a utiliza/etc/passwd
, seja apresentada uma mensagem amigável e que quaisquer scripts / comandos que tentem fazer uso de esse logon recebe o código de saída 1.Segurança
No que diz respeito à segurança, você normalmente vê uma
/sbin/nologin
ou outras vezes/bin/false
, entre outras coisas nesse campo. Ambos servem ao mesmo propósito, mas/sbin/nologin
é provavelmente o método preferido. De qualquer forma, eles estão limitando o acesso direto a um shell como essa conta de usuário específica.Por que isso é considerado valioso com relação à segurança?
O "porquê" é difícil de descrever completamente, mas o valor de limitar a conta de um usuário dessa maneira é que ele impede o acesso direto por meio do
login
aplicativo quando você tenta obter acesso usando a conta de usuário.Usando um
nologin
ou/bin/false
realiza isso. Limitar a superfície de ataque do sistema é uma técnica comum no mundo da segurança, seja desativando serviços em portas específicas ou limitando a natureza dos logins nos sistemas de uma pessoa.Ainda existem outras racionalizações para o uso
nologin
. Por exemplo,scp
não funcionará mais com uma conta de usuário que não designe um shell real, conforme descrito nas Perguntas e respostas sobre ServerFault intituladas: Qual é a diferença entre / sbin / nologin e / bin / false? .fonte
They both serve the same purpose, but /sbin/nologin is probably the preferred method.
Do ponto de vista da segurança, `/ sbin / nologin`` não é o método preferido; desperdiça tempo e ciclos, fornecendo uma resposta. Embora nenhum dos dois forneça uma segurança particularmente boa; são medidas de defesa em profundidade, mas na verdade não impedem que alguém execute um comando como um determinado usuário.nologin
é o método preferido por razões de UX, não por segurança - fazendosudo su someuser
e simplesmente não acontecendo nada porque o shell de loginfalse
é confuso. Além disso, ambos não impedir que alguém executando um comando como um determinado usuário em algumas circunstâncias, descritos em respostas aqui.Definitivamente, serve a um propósito de segurança. Por exemplo, observe o bug abaixo apresentado para um usuário do sistema que tinha um shell.
Eu recomendo que você leia esta maravilhosa resposta de Gilles, onde ele também forneceu links para alguns dos erros.
fonte
ssh user@site
, e isso funcionasse, eles não continuariam tentandossh user@site /bin/bash
, mas tenho certeza de que ainda funcionaria independentemente do shell declarado.ssh user@site /bin/bash
retorna umaThis account is currently not available.
mensagem simples . Além disso, esta resposta diz nologin protege o acesso SSHPara adicionar às excelentes respostas de @slm e @ramesh:
Sim, como você apontou, ainda é possível alternar para usuários com nologin como shell padrão executando
sudo
com um shell definido, mas, neste caso, você deve:su
comando eOs usuários que definiram o nologin como seu shell padrão geralmente têm privilégios mais altos / são capazes de causar mais danos ao sistema do que um usuário comum, portanto, impossibilitados de efetuar login diretamente, tentam limitar o dano que uma violação do sistema pode sofrer .
fonte
Além das excelentes respostas que foram dadas, serve a outro propósito.
Se você executar um daemon FTP no seu servidor, ele verificará o shell de login dos usuários que tentam fazer login. Se o shell não estiver listado
/etc/shells
, não permitirá que eles façam login. Portanto, conceder às contas do daemon um shell especial impede que alguém modifique a conta via FTP.fonte
Junto às ótimas respostas já dadas, posso pensar no seguinte cenário.
Um bug de segurança em um serviço em execução como usuário restrito permite gravar um arquivo como esse usuário. Este arquivo pode ser ~ / .ssh / allowed_keys.
Isso permite que o invasor efetue login diretamente em um shell, o que facilitaria muito a execução de uma escalação de privilégios.
Não permitir um shell de login tornaria essa opção muito mais difícil.
fonte
Geralmente eu diria que / bin / false e / sbin / nologin são os mesmos - mas suponho que depende de qual servidor SSH você está usando.
Seria prudente apontar que essa recente exploração no OpenSSH parece afetar / bin / false logins, mas NÃO / sbin / nologin. No entanto, ele afirma que o Dropbear é diferente dessa maneira (também a exploração se aplica especificamente ao OpenSSH).
A exploração afeta a maioria das versões:
7.2p1 e inferior (todas as versões; desde ~ 20 anos) Com o encaminhamento X11 ativado
https://www.exploit-db.com/exploits/39569/
Então, com base nisso - eu pessoalmente faria / sbin / nologin, no entanto, não tenho certeza se isso pode afetar serviços que criam a entrada / bin / false em / etc / passwd. Você pode experimentar e ver seus resultados, mas faça-o por sua conta e risco! Suponho que, no pior caso, você pode alterá-lo novamente e reiniciar qualquer serviço afetado. Pessoalmente, tenho algumas entradas usando / bin / false - Não tenho certeza se quero me preocupar com isso, pois o encaminhamento X11 não é algo que eu habilitei;)
Se você usa o OpenSSH (acho que muita gente ...) E tem o encaminhamento do X11 ativado - você pode considerar o / sbin / nologin (ou talvez mudar para o Dropbear).
fonte
Geralmente, é uma boa prática de segurança definir contas de serviço e aplicativo para logon não interativo. Um usuário autorizado ainda pode ter acesso a essas contas usando SU ou SUDO, mas todas as suas ações são rastreadas nos arquivos de log do Sudoers e podem ser rastreadas até o usuário que executou comandos sob privilégios de conta de serviço. É por isso que é importante armazenar arquivos de log em um sistema centralizado de gerenciamento de logs, para que os administradores do sistema não tenham acesso para alterar os arquivos de log. O usuário executando comandos em SU ou SUDO já está autorizado a acessar o sistema.
Por outro lado, um usuário externo ou não autorizado ao sistema não terá acesso completo ao login usando essas contas, e isso é uma medida de segurança.
fonte
Sim, serve a um propósito de segurança. É uma medida de defesa em profundidade.
O principal motivo pelo qual ele serve a um propósito é que existem vários bits de software que validarão alguma forma de credencial de login para um usuário especificado e, em seguida, usarão o shell de login desse usuário para executar um comando. Talvez o exemplo mais notável seja o SSH. Se você se autenticar com êxito como usuário pelo SSH, o SSH iniciará o shell de login do usuário (ou o utilizará para executar o comando fornecido, se você usar a
ssh [email protected] 'command to run'
sintaxe).Obviamente, o ideal é que um invasor não consiga se autenticar como usuário. Mas suponha que a seguinte situação ocorra:
Agora seu atacante pode escrever uma chave pública SSH para
~/.ssh/authorized_keys
, em seguida, entrar e explodir! - eles têm acesso shell ao seu servidor.Se o usuário tiver
/usr/sbin/nologin
como shell de logon, mesmo depois que o invasor gravar com sucesso a chave públicaauthorized_keys
, isso não será útil. Tudo o que eles permitem é executar remotamentenologin
, o que não é muito útil. Eles não podem obter conchas e seu ataque foi mitigado.Caso esse cenário pareça muito hipotético, gostaria de observar que fui atingido precisamente por esse ataque em algum momento de 2015, cerca de um ano depois de ter feito essa pergunta. Como um maldito idiota, eu havia deixado uma instância Redis sem senha aberta para o mundo. Ele foi direcionado pelo ataque do Redis crackit , no qual o invasor insere uma chave pública SSH no seu banco de dados Redis, em seguida, envia um comando dizendo ao Redis para gravar o conteúdo do banco de dados
.ssh/authorized_keys
e tenta fazer o SSH. Fui salvo das consequências da minha própria incompetência apenas pelo fato de os mantenedores doredis-server
pacote Apt (que eu costumava instalar o Redis) terem a sabedoria de fazê-lo rodar o Redis como umredis
usuário que não possui diretório inicial ou shell de login; se não fosse por eles, meu servidor provavelmente teria sido resgatado ou acabado como parte da botnet de algum hacker.Essa experiência me proporcionou um certo grau de humildade e me fez apreciar a importância da defesa em profundidade e, em particular, de não conceder shells de login para contas que executam servidores da web, bancos de dados e outros serviços em segundo plano.
fonte