Historicamente, os direitos do sudo eram regulados pelo conteúdo dos arquivos de
/etc/sudoers.d e
visudo , e a autorização da chave era
realizada usando
~ / .ssh / allowed_keys . No entanto, com o crescimento da infraestrutura, há um desejo de gerenciar esses direitos centralmente. Até o momento, pode haver várias soluções:
- Sistema de Gerenciamento de Configuração - Chef , Fantoche , Ansible , Sal
- Active Directory + sssd
- Várias distorções na forma de scripts e edição manual de arquivos
Na minha opinião subjetiva, a melhor opção para gerenciamento centralizado ainda é um monte de
Active Directory +
sssd . As vantagens dessa abordagem são:
- Verdadeiramente um único diretório de usuário centralizado.
- Distribuir direitos sudo é sobre adicionar um usuário a um grupo de segurança específico.
- No caso de vários sistemas Linux, é necessário introduzir verificações adicionais para determinar o SO ao usar sistemas de configuração.
O pacote de hoje será dedicado ao
pacote Active Directory +
sssd para gerenciar direitos
sudo e armazenar chaves
ssh em um único repositório.
Então, a platéia congelou em um silêncio tenso, o maestro levantou a varinha e a orquestra preparada.
Vamos lá
Dado:
- Domínio do Active Directory testopf.local no Windows Server 2012 R2.
- Host Linux executando o Centos 7
- Autorização configurada usando sssd
Ambas as soluções fazem alterações no
esquema do
Active Directory ; portanto, verificamos tudo em um ambiente de teste e só então fazemos alterações na infraestrutura de trabalho. Quero observar - todas as alterações são baseadas em pontos e, de fato, adicionam apenas os atributos e classes necessários.
Etapa 1: gerenciar funções sudo através do Active Directory .
Para estender o
esquema do
Active Directory, você precisa baixar a última versão do
sudo - 1.8.27 hoje. Descompacte, copie o arquivo schema.ActiveDirectory do diretório ./doc para o controlador de domínio. Na linha de comando com direitos de administrador do diretório em que você copiou o arquivo, execute:
ldifde -i -f schema.ActiveDirectory -c dc=X dc=testopf,dc=local
(Não esqueça de substituir seus valores)
Abra
adsiedit.msc e conecte-se ao contexto padrão:
Na raiz do domínio, crie uma unidade
sudoers . (Os burgueses argumentam teimosamente que é nessa subdivisão que o daemon
sssd procura por objetos
sudoRole . No entanto, após ativar a depuração detalhada e examinar os logs, foi revelado que a pesquisa é realizada em toda a árvore de catálogos.)
Crie o primeiro objeto na unidade que pertence à classe
sudoRole . O nome pode ser escolhido absolutamente arbitrariamente, pois serve apenas para identificação conveniente.
Entre os possíveis atributos disponíveis da extensão do esquema, os principais são:
- sudoCommand - Determina quais comandos têm permissão para executar no host.
- sudoHost - determina a quais hosts essa função se aplica. Pode ser definido como ALL ou para um host individual por nome. Também é possível usar uma máscara.
- sudoUser - indica quais usuários têm permissão para executar o sudo .
Se um grupo de segurança for especificado, adicione o sinal "%" no início do nome. Se houver espaços no nome do grupo, não há com o que se preocupar. A julgar pelos logs, o mecanismo sssd assume a tarefa de escapar de espaços.
Figura 1. Objetos sudoRole na unidade sudoers na raiz do diretório
Figura 2. Associação aos grupos de segurança especificados nos objetos sudoRole.A seguinte configuração é feita no lado do Linux.
No arquivo
/etc/nsswitch.conf , adicione a linha ao final do arquivo:
sudoers: files sss
No arquivo
/etc/sssd/sssd.conf na seção
[sssd] , adicione
sudo aos serviços
cat /etc/sssd/sssd.conf | grep services services = nss, pam, sudo
Após todas as operações, você precisa limpar o cache do daemon sssd. As atualizações automáticas são feitas a cada 6 horas, mas por que precisamos esperar tanto quando queremos agora?
sss_cache -E
Muitas vezes acontece que limpar o cache não ajuda. Então paramos o serviço, limpamos a base, iniciamos o serviço.
service sssd stop rm -rf /var/lib/sss/db/* service sssd start
Nós nos conectamos com o primeiro usuário e verificamos que ele pode ser acessado em sudo
su user1 [user1@testsshad log]$ id uid=1109801141(user1) gid=1109800513(domain users) groups=1109800513(domain users),1109801132(admins_) [user1@testsshad log]$ sudo -l [sudo] password for user1: Matching Defaults entries for user1 on testsshad: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User user1 may run the following commands on testsshad: (root) /usr/bin/ls, /usr/bin/cat
Fazemos o mesmo com o nosso segundo usuário:
su user2 [user2@testsshad log]$ id uid=1109801142(user2) gid=1109800513(domain users) groups=1109800513(domain users),1109801138(sudo_root) [user2@testsshad log]$ sudo -l Matching Defaults entries for user2 on testsshad: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User user2 may run the following commands on testsshad: (root) ALL
Essa abordagem permite definir centralmente as funções do sudo para diferentes grupos de usuários.
Armazenando e usando chaves ssh no Active Directory
Com uma pequena extensão do esquema, é possível armazenar chaves ssh em atributos de usuário do Active Directory e usá-las para autorização em hosts Linux.
A autorização via sssd deve ser configurada.
Adicione o atributo desejado usando o script do PowerShell.
AddsshPublicKeyAttribute.ps1Função New-AttributeID {
$ Prefixo = "1.2.840.113556.1.8000.2554"
$ GUID = [System.Guid] :: NewGuid (). ToString ()
$ Peças = @ ()
$ Parts + = [UInt64] :: Parse ($ guid.SubString (0.4), “AllowHexSpecifier”)
$ Parts + = [UInt64] :: Parse ($ guid.SubString (4,4), “AllowHexSpecifier”)
$ Parts + = [UInt64] :: Parse ($ guid.SubString (9,4), "AllowHexSpecifier")
$ Parts + = [UInt64] :: Parse ($ guid.SubString (14,4), “AllowHexSpecifier”)
$ Parts + = [UInt64] :: Parse ($ guid.SubString (19,4), “AllowHexSpecifier”)
$ Parts + = [UInt64] :: Parse ($ guid.SubString (24.6), “AllowHexSpecifier”)
$ Parts + = [UInt64] :: Parse ($ guid.SubString (30.6), “AllowHexSpecifier”)
$ oid = [String] :: Format ("{0}. {1}. {2}. {3}. {4}. {5}. {6}. {7}", prefixo $, $ Parts [ 0]
$ Peças [1], $ Peças [2], $ Peças [3], $ Peças [4], $ Peças [5], $ Peças [6])
$ oid
}
$ schemaPath = (Get-ADRootDSE) .schemaNamingContext
$ oid = New-AttributeID
$ attribute = @ {
lDAPDisplayName = 'sshPublicKey';
attributeId = $ oid;
oMSyntax = 22;
attributeSyntax = "2.5.5.5";
isSingleValued = $ true;
adminDescription = 'Chave pública do usuário para login SSH';
}
New-ADObject -Name sshPublicKey -Type attributeSchema -Path $ schemapath -OtherAttributes $ attribute
$ userSchema = get-adobject -SearchBase $ schemapath -Filter 'name -eq "usuário"'
$ userSchema | Set-ADObject -Add @ {mayContain = 'sshPublicKey'}
Após adicionar o atributo, reinicie os Serviços de Domínio Active Directory.
Passamos aos usuários do Active Directory. De qualquer maneira conveniente para você, geramos um par de chaves para conexão ssh.
Inicie o PuttyGen, clique no botão "Gerar" e clique freneticamente no mouse dentro de uma área vazia.
Após a conclusão do processo, podemos salvar as chaves pública e privada, preencher a chave pública no atributo de usuário do Active Directory e aproveitar o processo. No entanto, a chave pública deve ser usada na janela "
Chave pública para colar no arquivo OpenSSH allowed_keys: ".

Adicione a chave ao atributo do usuário.
Opção 1 - GUI:

Opção 2 - PowerShell:
get-aduser user1 | set-aduser -add @{sshPublicKey = 'AAAAB...XAVnX9ZRJJ0p/Q=='}
Portanto, temos no momento: um usuário com o atributo sshPublicKey preenchido, um cliente Putty configurado para autorização de chave. Resta um pequeno ponto: como fazer o daemon sshd extrair a chave pública que precisamos dos atributos do usuário. Um pequeno script encontrado nos espaços abertos da Internet burguesa lida com sucesso com isso.
cat /usr/local/bin/fetchSSHKeysFromLDAP
Definimos 0500 permissões de root nele.
chmod 0500 /usr/local/bin/fetchSSHKeysFromLDAP
Neste exemplo, a conta de administrador é usada para a ligação ao diretório. Em condições de combate, deve haver uma conta separada com um conjunto mínimo de direitos.
Pessoalmente, fiquei muito confuso com o momento da senha em sua forma pura no script, apesar dos direitos estabelecidos.
Opção de solução:
O acorde final na suíte de hoje está editando sshd_config
cat /etc/ssh/sshd_config | egrep -v -E "#|^$" | grep -E "AuthorizedKeysCommand|PubkeyAuthe" PubkeyAuthentication yes AuthorizedKeysCommand /usr/local/bin/fetchSSHKeysFromLDAP AuthorizedKeysCommandUser root
Como resultado, obtemos a seguinte sequência com a autenticação de chave configurada no cliente ssh:
- O usuário se conecta ao servidor, indicando seu nome de usuário.
- O daemon sshd, por meio de um script, extrai o valor da chave pública do atributo de usuário no Active Directory e autoriza as chaves.
- O daemon sssd autentica ainda mais o usuário com base na associação ao grupo. Atenção! Se isso não estiver configurado, qualquer usuário do domínio terá acesso ao host.
- Quando o sudo tenta, o daemon sssd procura funções no diretório do Active Directory. Se houver funções, os atributos e a associação de usuários do grupo serão verificados (se sudoRoles estiver configurado para usar grupos de usuários)
Sumário
Portanto, as chaves são armazenadas nos atributos de usuário do Active Directory, permissões sudo - da mesma forma, o acesso aos hosts Linux por contas de domínio é realizado verificando a associação no grupo do Active Directory.
A onda final da varinha do maestro - e o salão congela em silêncio.
Recursos utilizados por escrito: