Назад | Перейти на главную страницу

Можно ли использовать Kerberos поверх TLS через sssd?

Задний план

Я пытаюсь войти (через SSH в инстанс Amazon Linux EC2, работающий sssd) в качестве пользователей, которых я создал в своем AWS Directory Services Simple AD. Я проверяю подлинность с помощью Kerberos и идентифицирую пользователя с помощью LDAP (все через sssd.) Я подключаюсь к Simple AD через ELB через несколько прокси-серверов.

Проблема

Когда я настраиваю ELB для использования TLS для порта Kerberos, sssd не удается подключиться к серверу Kerberos, и вход в систему не выполняется. Без TLS он работает нормально, и как только я вхожу в систему без TLS, учетные данные кэшируются, и вход продолжает работать, когда я снова включаю TLS.

RFC 6251 представляет объяснение того, как Kerberos V5 может передаваться через TLS, так что гипотетически это должно быть возможно, верно? Я не уверен, правильно ли я делаю это или sssd не поддерживает Kerberos через TLS. Поиск в Google не дает ничего плодотворного, и на страницах руководства нет ничего, казалось бы, важного.

Обратите внимание, что у меня LDAPS отлично работает через ELB, поэтому я, по крайней мере, знаю, что я не совсем сбился с пути.

TL; DR как ответить на мой вопрос

Скажите мне либо:


Сообщение об ошибке

Это из вывода sssd. Обратите внимание, что я отредактировал 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!

Архитектура

Вот как выглядит моя архитектура вокруг Simple AD:

Эта настройка позволяет мне использовать LDAPS, хотя AWS Simple AD не поддерживает его. Я предполагал, что это также позволит мне использовать Kerberos поверх TLS.

Запись route53 для ELB: directory.myteam.mycompany.com, но домен, который я использовал для Simple AD, это myteam.mycompany.internal.

Конфигурация ELB

Я использовал терраформ для создания архитектуры. Вот только определение ресурса ELB, остальное не имеет значения:

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"
  }
}

Обратите внимание, что сертификат, который я использую, получен от доверенного центра сертификации и указан для *.myteam.mycompany.com.

Конфигурация на машине с 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

В дополнение к этим двум файлам я включил аутентификацию по паролю в sshd_config и включил sssd в модулях pam с 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

Версии программного обеспечения

То, что вы хотите достичь с помощью RFC 6251, невозможно с MIT Kerberos, поскольку нет планов по реализации этой схемы. Однако, начиная с MIT Kerberos 1.13, существует поддержка проксирования Kerberos через HTTPS, поддерживая тот же протокол, который поддерживает Microsoft Active Directory, MS-KKDCP. Клиентская сторона для MS-KKDCP также была перенесена на RHEL 7 (https://rhn.redhat.com/errata/RHSA-2015-0439.html).

Функциональность зависит от способности клиентов проксировать трафик Kerberos. SSSD, работающий на RHEL 7 / CentOS 7, должен иметь такую ​​возможность. Думаю, в Amazon Linux нет этой версии библиотеки Kerberos, поэтому ваш подход не сработает.

Кроме того, Amazon Simple AD - это Samba AD, созданная с использованием кербера Heimdal. Он также не поддерживает MS-KKDCP, поэтому не может использоваться в качестве прокси-сервера MS-KKDCP.