Fundo
Estou tentando fazer login (via SSH, em uma instância do Amazon Linux EC2 em execução sssd
) como usuários que criei em meu AWS Directory Services Simple AD. Estou autenticando com Kerberos e identificando o usuário com LDAP (tudo por meio de sssd
.) Eu me conecto ao Simple AD por meio de um ELB em vários servidores proxy.
Problema
Quando configuro o ELB para usar TLS para a porta Kerberos, sssd
não consigo conectar ao servidor Kerberos e o login falha. Sem o TLS, funciona muito bem e, assim que faço o login sem o TLS, as credenciais são armazenadas em cache e o login continua a funcionar quando ligo o TLS novamente.
O RFC 6251 apresenta uma explicação de como o Kerberos V5 pode ser transportado por TLS, portanto, hipoteticamente, isso deveria ser possível, certo? Não tenho certeza se não estou fazendo isso corretamente ou se sssd
não oferece suporte a Kerberos sobre TLS. A pesquisa no Google não produz nada frutífero e as páginas do manual não têm nada aparentemente relevante nelas.
Observe que tenho o LDAPS funcionando perfeitamente por meio do ELB, então sei pelo menos que não estou completamente fora do caminho.
TL;DR como responder minha pergunta
Diga-me também:
- O que estou fazendo de errado ao configurar o Kerberos sobre TLS ou
sssd
não suporta Kerberos sobre TLS
Mensagem de erro
Isso é da saída de sssd
. Observe que editei os endereços IP.
(Thu Dec 31 18:36:43 2015) [[sssd[krb5_child[2780]]]] [sss_child_krb5_trace_cb] (0x4000): [2780] 1451587003.307171: Sending request (218 bytes) to MYTEAM.MYCOMPANY.INTERNAL
(Thu Dec 31 18:36:43 2015) [[sssd[krb5_child[2780]]]] [sss_child_krb5_trace_cb] (0x4000): [2780] 1451587003.307390: Initiating TCP connection to stream 1.2.3.4:88
(Thu Dec 31 18:36:43 2015) [[sssd[krb5_child[2780]]]] [sss_child_krb5_trace_cb] (0x4000): [2780] 1451587003.309053: Sending TCP request to stream 1.2.3.4:88
(Thu Dec 31 18:36:43 2015) [[sssd[krb5_child[2780]]]] [sss_child_krb5_trace_cb] (0x4000): [2780] 1451587003.310487: TCP error receiving from stream 1.2.3.4:88: 104/Connection reset by peer
(Thu Dec 31 18:36:43 2015) [[sssd[krb5_child[2780]]]] [sss_child_krb5_trace_cb] (0x4000): [2780] 1451587003.310609: Terminating TCP connection to stream 1.2.3.4:88
(Thu Dec 31 18:36:43 2015) [[sssd[krb5_child[2780]]]] [sss_child_krb5_trace_cb] (0x4000): [2780] 1451587003.310729: Sending initial UDP request to dgram 1.2.3.4:88
# Lots of other output...
(Thu Dec 31 18:36:58 2015) [sssd[be[myteam]]] [krb5_child_timeout] (0x0040): Timeout for child [2780] reached. In case KDC is distant or network is slow you may consider increasing value of krb5_auth_timeout.
(Thu Dec 31 18:36:58 2015) [sssd[be[myteam]]] [krb5_auth_done] (0x0020): child timed out!
Arquitetura
Aqui está a aparência da minha arquitetura em torno do Simple AD:
Essa configuração me permite usar o LDAPS, mesmo que o Simple AD da AWS não o suporte. Presumi que também me permitiria usar Kerberos sobre TLS.
O registro route53 para o ELB é directory.myteam.mycompany.com
, mas o domínio que usei para o Simple AD é myteam.mycompany.internal
.
Configuração do ELB
Eu usei terraform para criar a arquitetura. Aqui está apenas a definição do recurso ELB, já que o resto é irrelevante:
resource "aws_elb" "proxy" {
name = "directory-proxy-pub"
subnets = ["${split(",", module.vpc.public_subnet_ids_dsv)}}"]
cross_zone_load_balancing = true
security_groups = [ "${aws_security_group.elb-proxy.id}" ]
listener {
lb_port = 636
lb_protocol = "ssl"
instance_port = 389
instance_protocol = "tcp"
ssl_certificate_id = "${var.my_cert}"
}
listener {
lb_port = 88
lb_protocol = "ssl"
instance_port = 88
instance_protocol = "tcp"
ssl_certificate_id = "${var.my_cert}"
}
health_check {
interval = 15
timeout = 5
unhealthy_threshold = 2
healthy_threshold = 3
target = "TCP:389"
}
tags {
Name = "directory-proxy"
}
}
Observe que o certificado que estou usando é de uma CA confiável e é especificado para *.myteam.mycompany.com
.
Configuração na máquina rodando sssd
/etc/sssd/sssd.conf
:
[sssd]
config_file_version = 2
reconnection_retries = 3
sbus_timeout = 30
services = nss, pam
domains = myteam
[nss]
default_shell = /bin/bash
fallback_homedir = /home/%u
ldap_user_home_directory = unixHomeDirectory
[pam]
reconnection_retries = 3
offline_credentials_expiration = 2
offline_failed_login_attempts = 3
offline_failed_login_delay = 5
[domain/myteam]
enumerate = true
cache_credentials = TRUE
id_provider = ldap
ldap_uri = ldaps://directory.myteam.mycompany.com
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt
ldap_default_bind_dn = CN=test-user,CN=users,DC=myteam,DC=mycompany,DC=internal
ldap_default_authtok = REDACTED_PASSWORD
ldap_id_use_start_tls = true
ldap_schema = AD
ldap_force_upper_case_realm = true
ldap_id_mapping = true
ldap_search_base = CN=users,DC=myteam,DC=mycompany,DC=internal
ldap_user_uuid = none
ldap_group_uuid = none
chpass_provider = krb5
auth_provider = krb5
krb5_server = directory.myteam.mycompany.com
krb5_realm = MYTEAM.MYCOMPANY.INTERNAL
krb5_changepw_principal = kadmin/changepw
krb5_ccachedir = /tmp
krb5_ccname_template = FILE:%d/krb5cc_%U_XXXXXX
krb5_auth_timeout = 15
krb5_canonicalize = True
/etc/sysconfig/authconfig
:
IPADOMAINJOINED=no
USEMKHOMEDIR=yes
USEPAMACCESS=no
CACHECREDENTIALS=yes
USESSSDAUTH=yes
USESHADOW=yes
USEWINBIND=no
PASSWDALGORITHM=sha512
FORCELEGACY=yes
USEFPRINTD=no
FORCESMARTCARD=no
USEDB=no
USELDAPAUTH=no
USEPASSWDQC=no
IPAV2NONTP=no
WINBINDKRB5=no
USELOCAUTHORIZE=yes
USEECRYPTFS=no
USECRACKLIB=yes
USEIPAV2=no
USEWINBINDAUTH=no
USESMARTCARD=no
USELDAP=yes
USENIS=no
USEKERBEROS=no
USESYSNETAUTH=no
USESSSD=yes
USEPWQUALITY=yes
USEHESIOD=no
Além desses dois arquivos, certifiquei-me de habilitar a autenticação de senha sshd_config
e habilitei o sssd nos módulos pam com sudo authconfig --updateall --enablesssd --enablesssdauth
.
/etc/pam.d/system-auth
:
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet_success
auth sufficient pam_sss.so use_first_pass
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 500 quiet
account [default=bad success=ok user_unknown=ignore] pam_sss.so
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password sufficient pam_sss.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session optional pam_mkhomedir.so umask=0077
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_sss.so
Versões de software
uname -a
:Linux ip-172-31-31-2 4.1.10-17.31.amzn1.x86_64 #1 SMP Sat Oct 24 01:31:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
sssd
1.12.2
O que você deseja alcançar com o RFC 6251 não é possível com o MIT Kerberos, pois não há planos para implementar esse esquema. No entanto, desde o MIT Kerberos 1.13, há suporte para proxy Kerberos sobre HTTPS, suportando o mesmo protocolo que o Active Directory da Microsoft suporta, MS-KKDCP. O lado do cliente para MS-KKDCP também foi portado para RHEL 7 ( https://rhn.redhat.com/errata/RHSA-2015-0439.html ).
A funcionalidade depende da capacidade de proxy do tráfego Kerberos pelos clientes. O SSSD em execução no RHEL 7/CentOS 7 deve ser capaz de fazer isso. Acho que o Amazon Linux não tem esta versão da biblioteca Kerberos, então sua abordagem não funcionaria.
Além disso, o Simple AD da Amazon é o Samba AD criado com Heimdal kerberos. Ele também não suporta MS-KKDCP, portanto não pode ser usado como um proxy MS-KKDCP.