/ Usr / sbin / nologin como um shell de logon serve a um propósito de segurança?

78

No meu /etc/passwdarquivo, posso ver que o www-datausuário usado pelo Apache, assim como todos os tipos de usuários do sistema, tem um /usr/sbin/nologinou /bin/falsecomo 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?

Mark Amery
fonte

Respostas:

51

Se você der uma olhada na nologinpágina de manual, verá a seguinte descrição.

excerto

nologin exibe uma mensagem de que uma conta não está disponível e sai diferente de zero. Destina-se como um campo de shell de substituição a negar o acesso de login a uma conta.

Se o arquivo /etc/nologin.txtexistir, nologinexibe seu conteúdo para o usuário em vez da mensagem padrão.

O código de saída retornado por nologiné sempre 1.

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/nologinou 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 loginaplicativo quando você tenta obter acesso usando a conta de usuário.

Usando um nologinou /bin/falserealiza 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, scpnã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? .

slm
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.
Parthian Shot
4
@ParthianShot O tempo e os ciclos necessários para ecoar uma única string codificada, em relação ao trabalho que o sistema operacional estiver executando de qualquer maneira, a fim de procurar qual shell executar para o usuário, parece improvável que seja de importância crucial para quem constrói uma negação de serviço ataque. O slm está sugerindo que nologiné o método preferido por razões de UX, não por segurança - fazendo sudo su someusere simplesmente não acontecendo nada porque o shell de login falseé 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.
Mark-Amery
28

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.

Meu servidor debian foi comprometido devido à conta daemon ter um shell de login válido e ter o samba aberto para acesso à Internet. A invasão foi feita configurando uma senha remotamente via samba para a conta daemon e efetuando login através do ssh. Alguma exploração local da raiz foi usada para POSSUIR meu próprio servidor.

Eu recomendo que você leia esta maravilhosa resposta de Gilles, onde ele também forneceu links para alguns dos erros.

Existem erros arquivados sobre esta questão no Debian (274229, 330882, 581899), atualmente abertos e classificados como "lista de desejos". Costumo concordar que esses são erros e os usuários do sistema devem ter / bin / false como shell, a menos que pareça necessário fazer o contrário.

Ramesh
fonte
... Não vejo como isso realmente depende especificamente do shell declarado para o usuário. Se o atacante apenas executasse ssh user@site, e isso funcionasse, eles não continuariam tentando ssh user@site /bin/bash, mas tenho certeza de que ainda funcionaria independentemente do shell declarado.
Tiro parta
2
@ParthianShot, evidência anedótica: no meu servidor CentOS, quando o shell de uma conta é definido como / sbin / nologin, ssh user@site /bin/bashretorna uma This account is currently not available.mensagem simples . Além disso, esta resposta diz nologin protege o acesso SSH
metavida
@ParthianShot com base na descrição, não foi isso que aconteceu. O que aconteceu é: o Samba foi configurado incorretamente; o atacante configurou o acesso ssh via Samba; o invasor efetuou logon via ssh. Embora esse caso seja obviamente culpa do administrador de sistemas, se você substituir "Samba configurado incorretamente" por "serviço explorável", impedir o acesso ao login faz sentido, pois reduz a superfície do ataque. é claro, se a exploração concede execução local, ter acesso ssh em vez de não fazer, faz pouca diferença.
Marcus
18

Para 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 sudocom um shell definido, mas, neste caso, você deve:

  1. Efetue login como outro usuário que tenha um shell válido
  2. Tenha permissões sudo configuradas para esse usuário executar o sucomando e
  3. Sua tentativa de su foi registrada no log do sudoers (assumindo, é claro, que o log do sudo esteja ativado).

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

Warwick
fonte
7

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.

Barmar
fonte
7

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.

Eric Seynaeve
fonte
1

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

Gr33k
fonte
0

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.

John
fonte
0

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:

  • Um servidor que você controla está executando um serviço da Web como um usuário que possui um diretório inicial e um shell de login
  • Um invasor descobre uma vulnerabilidade nesse serviço que permite que o invasor grave arquivos no diretório inicial do usuário

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/nologincomo shell de logon, mesmo depois que o invasor gravar com sucesso a chave pública authorized_keys, isso não será útil. Tudo o que eles permitem é executar remotamente nologin, 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_keyse tenta fazer o SSH. Fui salvo das consequências da minha própria incompetência apenas pelo fato de os mantenedores do redis-serverpacote Apt (que eu costumava instalar o Redis) terem a sabedoria de fazê-lo rodar o Redis como umredisusuá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.

Mark Amery
fonte