Permitir que o usuário1 “su - usuário2” sem senha


51

Eu preciso permitir que o usuário martinmude para o usuário martin-testsem senha

su - martin-test

Eu acho que isso pode ser configurado em /etc/pam.d/su. Já existem algumas linhas nesse arquivo que podem ser descomentadas. No entanto, não gosto da ideia de adicionar usuário martinao grupo wheel. Não quero dar martinmais privilégios do que poder mudar martin-test. Eu também não quero usar sudo.

Qual seria a melhor maneira de fazer isso, mantendo os privilégios do usuário martinmínimos?


2
Isso é mais fácil de fazer, por sudoexemplo sudo -u martin-test -i. Existe uma razão pela qual você está perguntando especificamente su?
Jordanm

Não quero instalar sudoapenas por causa disso (normalmente não uso sudoe não gosto particularmente). E eu acho que usar pamé uma maneira mais limpa e transparente de fazer isso.
Martin Vegter

3
@MartinVegter Como você pode ver na resposta do script, fazer isso através de algum tipo de mecanismo pam é muito feio. Realmente é exatamente para isso que sudose destina. Além de não usá-lo normalmente, quais são as objeções?
224 Patrick Patrick

11
Se uma solução limpa for possível pam, eu preferiria isso sudo. Se sudoé a única possibilidade, isso também é bom. Minhas objeções sudosão principalmente ideológicas: não gosto da ideia de usuário administrando sudo foo. Quando preciso fazer administração, efetuo login como root. Caso contrário, eu entrarei como usuário. Essas duas funções distintas não devem ser misturadas. Além disso, eu já tenho paminfraestrutura instalada. Não quero instalar outro setuidprograma que possa introduzir bugs de segurança.
Martin Vegter

5
@ MartinVegter Você não precisa fazer sudo foocomandos específicos. Sudo tem sudo -sque irá lançar um shell. sudo é um utilitário muito comum, o que significa que sua segurança foi completamente avaliada, muito mais do que alguns truques de pam. Eu também argumentaria que a obtenção de um shell raiz para tarefas é muito mais insegura do que o lançamento de comandos específicos. Quando você inicia um shell, você executa tudo como root. Se alguma dessas coisas (como uma simples ls) tiver uma vulnerabilidade de segurança, você acabou de abrir uma brecha na segurança.
1313 Patrick Patrick

Respostas:


61

Adicione as seguintes linhas logo abaixo da pam_rootok.solinha no seu /etc/pam.d/su:

auth  [success=ignore default=1] pam_succeed_if.so user = martin-test
auth  sufficient                 pam_succeed_if.so use_uid user = martin

Essas linhas executam verificações usando o pam_succeed_if.somódulo. Consulte também a sintaxe do arquivo de configuração Linux-PAM para saber mais sobre as authlinhas.

  • A primeira linha verifica se o usuário de destino é martin-test. Se for, nada acontece ( success=ignore) e continuamos na próxima linha para verificar o usuário atual . Caso contrário, a próxima linha será ignorada ( default=1) e continuamos nas linhas subseqüentes com as etapas de autenticação usuais.
  • A segunda linha verifica se o usuário atual é martin. Se for, o sistema considera o processo de autenticação como bem-sucedido e retorna ( sufficient). Caso contrário, nada acontece e continuamos nas linhas subseqüentes com as etapas de autenticação usuais.

Você também pode restringir sua um grupo, aqui o grupo allowedpeoplepode susem uma senha:

auth sufficient pam_succeed_if.so use_uid user ingroup allowedpeople

11
Se você deseja autorizar, se eles estão em um determinado grupo: auth grupo de usuários pam_succeed_if.so ingroup suficiente
shrimpwagon

@gnp Super Obrigado !! Trabalhando no iCinga com nrpe, tem que executar algum comando como usuário diferente !! Ajudou muito !!!!!! Obrigado!!!!!
26416 saravanakumar


Seria bom adicionar informações sobre como aplicar as alterações também.
Kyslik

@Kyslik, o que você quer dizer? As instruções sobre como editar os arquivos necessários estão na resposta ...
GnP 14/11

12

Se você não deseja alterar grupos ou usar sudo, use um módulo pam chamado pam_execpara executar scripts externos em um estágio pam.

Adicione uma linha no seu /etc/pam.d/suapós a pam_rootok.solinha:

auth       sufficient pam_exec.so quiet /path/to/script

/path/to/script possui as permissões 755 (rwxr-xr-x) e o seguinte conteúdo:

#!/bin/bash
if [ "$PAM_TYPE" == "auth" ] && \
[ "$PAM_USER" == "martin-test" ] && \
[ "$PAM_RUSER" == "martin" ]; then
  exit 0
else
  exit 1
fi

Portanto, este script existe com sucesso se su:

  • é chamado no contexto de autenticação,
  • o usuário que está chamando é martine
  • o usuário para autenticar é martin-test.

Vejo:

martin@host:~$ su - martin-test
martin-test@host:~$ exit
martin@host:~$ su - otheruser
Password: ****
otheruser@host:~$ 

11
O pam_access pode ser usado para fornecer funcionalidade semelhante, sem depender de um script. (isto é o que pam_access foi feito para fazer)
jsbillings

11
@jsbillings Você faria essa (com alguns detalhes) outra resposta?
Hauke ​​Laging

11
como eu precisaria modificar o meu /etc/pam.d/supara fazer uso da pam_accessminha situação?
Martin Vegter 6/02/2014

3
@jsbillings Na verdade, pam_accessnão posso fazer isso. Quando suestá passando pela pilha de pam, está fazendo isso como o usuário para o qual você está mudando, e não o usuário do qual está mudando. Então, se você adicionar uma regra como + : martin : ALL, permitirá que qualquer mudança para martin . Mesmo se você mudar martinpara martin-test, ainda permitirá que alguém faça isso. Você precisa analisar o usuário de quem você é e o usuário para quem está mudando. Realmente, este é exatamente o que sudoé para ...
Patrick

0

Se você não tiver acesso à conta raiz, mas tiver a senha do usuário que deseja usar para executar um comando, faça o seguinte.

  • Isso solicitará a senha do toto: su - toto -c whoami
  • Isso não será: ssh toto @ localhost whoami

Apenas instale sua chave pública em allowed_keys do toto


Resposta atenciosa .. No entanto, o comando que alguém quer tentar executar já está na máquina. Portanto, não faz sentido fazer ssh'ing no mesmo servidor.
Raja Anbazhagan

-1

Minha solução simples é:

sudo login -f martin-test

Se você quiser evitar o sudo a todo custo, acho que deve ser possível colocar isso em um script:

  1. de propriedade de root e com privilégios de root (usando o sinalizador setuid )
  2. executável por todos, também sem nenhum sudo.

No entanto, não consigo descobrir os bits chown roote chmod +s ToTest.sh, para fazer isso realmente funcionar:

#!/usr/bin/env bash
echo howdy, I am $(whoami)
sudo login -f martin-test

Eu ainda corro como meu usuário normal, como o eco me diz. E ainda requer senha sudo. Se estivesse rodando como root, poderia-se acabar com sudoa última linha ...


O sinalizador setuid em um script de shell (ou qualquer outro script) não funcionará no Linux e por boas razões. Observe que o script acima com um sinalizador suid funcional seria imediatamente uma armadilha: ele aciona o bash via "env" (bastante autodestrutivo, porque se você assume que não sabe onde bashé, por que assume que sabe onde envé ou se existe mesmo?). Mas no final, você não sabe exatamente basho que será. Pode vir do diretório do usuário que está chamando e ter sido compilado um minuto antes a partir do código-fonte. Você vê para onde estou indo? Ou o usuário pode substituir whoami...
David Tonhofer 26/01

Atualmente, meu cérebro está muito longe dessas questões para entender completamente, mas ainda agradece pelas explicações detalhadas.
Frank Nocke 28/01
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.