Ubuntu Server 22.04에 기존 openldap 서버가 있고 이 가이드에 따라 Kerberos 서버를 설정하려고 합니다.https://ubuntu.com/server/docs/service-kerberos-with-openldap-backend
계정이 생성되고 테스트되었으며 잘 작동합니다(cn으로 참조했지만 uid가 있습니다. 먼저 Apache 디렉터리 스튜디오에서 생성했습니다). "dpkg-reconfigure krb5-config"를 수행하고 /etc/krb5.conf를 편집하여 서버와 영역을 추가했습니다. 해당 문서에는 없지만 다른 곳에서 본 것 중 하나는 "[domain_realm]" 섹션을 만들고 여기에 내 도메인을 추가하는 것인데, 해봤지만 도움이 되지 않았습니다. /var/log/kerberos에 쓸 수 있도록 systemd 서비스를 수정해야 하는 로깅 섹션을 만들었지만 괜찮습니다. 그런 다음 나열된 대로 "kdb5_ldap_util" 명령을 실행하고 비밀번호를 입력한 후 성공적으로 완료된 것으로 보입니다. kdc-service 및 kadmin-service 비밀번호를 숨기는 작업을 수행하면 성공적으로 완료됩니다. kadm.acl 파일을 생성했는데, 괜찮습니다. 그런 다음 서비스를 시작하려고 하면 krb5kdc.log에 다음이 표시됩니다.
krb5kdc[712216](Error): Cannot find master key record in database - while fetching master keys list for realm SUBDOMAIN.DOMAIN.COM
그런 다음 "kadmin.local"을 실행하면 다음이 표시됩니다.
Authenticating as principal root/[email protected] with password.
kadmin.local: Cannot find master key record in database while initializing kadmin.local interface
결과적으로 /var/lib/krb5kdc/principal 파일은 생성되지 않습니다. 여기서 또 어떤 문제를 해결해야 할지 잘 모르겠지만, 이 시점에서 문제가 발생하여 어떤 지침이라도 주시면 감사하겠습니다. 도메인 및 하위 도메인이 변경된 아래 구성 파일:
/etc/krb5.conf:
[libdefaults]
default_realm = SUBDOMAIN.DOMAIN.COM
# The following krb5.conf variables are only for MIT Kerberos.
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
# The following encryption type specification will be used by MIT Kerberos
# if uncommented. In general, the defaults in the MIT Kerberos code are
# correct and overriding these specifications only serves to disable new
# encryption types as they are added, creating interoperability problems.
#
# The only time when you might need to uncomment these lines and change
# the enctypes is if you have local software that will break on ticket
# caches containing ticket encryption types it doesn't know about (such as
# old versions of Sun Java).
# default_tgs_enctypes = des3-hmac-sha1
# default_tkt_enctypes = des3-hmac-sha1
# permitted_enctypes = des3-hmac-sha1
# The following libdefaults parameters are only for Heimdal Kerberos.
fcc-mit-ticketflags = true
[logging]
kdc = FILE:/var/log/kerberos/krb5kdc.log
admin_server = FILE:/var/log/kerberos/kadmin.log
default = FILE:/var/log/kerberos/krb5lib.log
[realms]
SUBDOMAIN.DOMAIN.COM = {
kdc = hostname.subdomain.domain.com
admin_server = hostname.subdomain.domain.com
default_domain = subdomain.domain.com
database_module = openldap_ldapconf
}
[domain_realm]
.subdomain.domain.com = SUBDOMAIN.DOMAIN.COM
subdomain.domain.com = SUBDOMAIN.DOMAIN.COM
[dbdefaults]
ldap_kerberos_container_dn = cn=krbContainer,dc=subdomain,dc=domain,dc=com
[dbmodules]
openldap_ldapconf = {
db_library = kldap
# if either of these is false, then the ldap_kdc_dn needs to
# have write access
disable_last_success = true
disable_lockout = true
# this object needs to have read rights on
# the realm container, principal container and realm sub-trees
ldap_kdc_dn = "cn=kdc-service,ou=accounts,dc=subdomain,dc=domain,dc=com"
# this object needs to have read and write rights on
# the realm container, principal container and realm sub-trees
ldap_kadmind_dn = "cn=kadmin-service,ou=accounts,dc=subdomain,dc=domain,dc=com"
ldap_service_password_file = /etc/krb5kdc/service.keyfile
ldap_servers = ldapi:///
ldap_conns_per_server = 5
}
/etc/krb5kdc/kadm5.acl:
*/[email protected] *
/etc/krb5kdc/kdc.conf:
[kdcdefaults]
kdc_ports = 750,88
[realms]
SUBDOMAIN.DOMAIN.COM = {
database_name = /var/lib/krb5kdc/principal
admin_keytab = FILE:/etc/krb5kdc/kadm5.keytab
acl_file = /etc/krb5kdc/kadm5.acl
key_stash_file = /etc/krb5kdc/stash
kdc_ports = 750,88
max_life = 10h 0m 0s
max_renewable_life = 7d 0h 0m 0s
master_key_type = des3-hmac-sha1
#supported_enctypes = aes256-cts:normal aes128-cts:normal
default_principal_flags = +preauth
}
편집: user1686의 의견에 따르면 이제 계정에 잠재적인 액세스 문제가 있음을 알 수 있습니다. 이 부분에 대해서는 좀 무리가 있지만 'slapcat -b cn=config'를 사용하면 다음과 같은 olcAccess 규칙이 있습니다.
olcAccess: {0}to * by dn="cn=admin,dc=subdomain,dc=domain,dc=com" manage by dn="cn=surfrock66,ou=accounts,dc=subdomain,dc=domain,dc=com" manage by dn="cn=ldapbinduser,ou=accounts,dc=subdomain,dc=domain,dc=com" read by * break
olcAccess: {1}to dn.children="ou=accounts,dc=subdomain,dc=domain,dc=com" attrs=userPassword,shadowExpire,shadowInactive,shadowLastChange,shadowMax,shadowMin,shadowWarning by self write by anonymous auth
olcAccess: {2}to attrs=krbPrincipalKey by anonymous auth by dn.exact="cn=kdc-service,ou=accounts,dc=subdomain,dc=domain,dc=com" read by dn.exact="cn=kadmin-service,ou=accounts,dc=subdomain,dc=domain,dc=com" write by self write by * none
olcAccess: {3}to dn.subtree="cn=krbContainer,dc=subdomain,dc=domain,dc=com" by dn.exact="cn=kdc-service,ou=accounts,dc=subdomain,dc=domain,dc=com" read by dn.exact="cn=kadmin-service,ou=accounts,dc=subdomain,dc=domain,dc=com" write by * none
olcAccess: {4}to dn.subtree="dc=subdomain,dc=domain,dc=com" by self read
2022.12.08-08-36 PST 편집: 그래서 저는 훨씬 더 나아가 다음을 수행했습니다.
addprinc ldap/[email protected]
ktadd -k /etc/ldap/kerberos.ldap.hostname.subdomain.domain.com.keytab ldap/hostname.subdomain.domain.com
chown openldap:openldap /etc/ldap/kerberos.ldap.hostname.subdomain.domain.com.keytab
chmod 640 /etc/ldap/kerberos.ldap.hostname.subdomain.domain.com.keytab
/etc/default/slapd를 편집하고 다음을 추가했습니다.
export KRB5_KTNAME="FILE:/etc/ldap/kerberos.ldap.hostname.subdomain.domain.com.keytab"
서비스를 다시 시작해도 testaslauthd는 계속 작동하지만 ldapsearch -D는 작동하지 않습니다. LDAP에서 구성을 변경해야 하는지 궁금합니다. 제가 작업하던 리소스 중 하나에서 구성을 위해 이 ldif를 구성했지만 궁극적으로 이것이 무엇을 할 것인지, 그리고 그것이 옳았는지 이해하지 못한다고 생각합니다.
dn: cn=config
changetype: modify
add: olcSaslHost
olcSaslHost: hostname.subdomain.domain.com
-
add: olcSaslRealm
olcSaslRealm: SUBDOMAIN.DOMAIN.COM
-
add: olcAuthzRegexp
olcAuthzRegexp: {0}"cn=([^/]*),cn=subdomain.domain.com,cn=GSSAPI,cn=auth" "cn=$1,ou=accounts,dc=subdomain,dc=domain,dc=com"
-
add: olcAuthzRegexp
olcAuthzRegexp: {1}"cn=host/([^/]*).subdomain.domain.com,cn=subdomain.domain.com,cn=GSSAPI,cn=auth" "cn=$1,ou=hosts,dc=subdomain,dc=domain,dc=com"
-
add: olcAuthzRegexp
olcAuthzRegexp: {2}"uid=ldap/admin,cn=subdomain.domain.com,cn=GSSAPI,cn=auth" "cn=admin,dc=subdomain,dc=domain,dc=com"
이것이 마지막 누락 단계인 것 같은데요? LDAP를 sasl로 가리키는 구성에 뭔가가 있습니까? 아니면 내가 이 모든 것에 잘못 접근하고 있는 걸까요?
답변1
principal
DB2 형식 KDC 데이터베이스가 포함된 파일입니다. 귀하의 시스템에 생성되지 않았습니다.사용하지 않음백엔드 db2
– 대체 LDAP를 사용하고 있습니다.모두KDC용 로컬 저장소 – 따라서 로컬 데이터베이스 파일은 불필요하며 현재 발생한 문제와 관련이 없습니다.
지침에 따라 실행한 경우 LDAP를 통해 필요한 항목이 실제로 생성되었는지 확인해야 합니다. 최소한 에 대한 항목 과 에 대한 kdb5_ldap_util create
항목이 있어야 합니다 . 오류 메시지는 데이터베이스 mkey("마스터 키" 비밀번호로 암호화됨)를 보유하는 의사 주체인 "K/M" 항목에 관한 것입니다.K/M@<realm>
krbtgt/<realm>@<realm>
Kerberos LDAP 개체를 읽는 데 필요한 권한이 부여되지 않은 경우를 대비하여 KDC 계정을 사용하여 LDAP를 확인하십시오. (계좌는 그렇지 않습니다.필요uid를 갖고; 로컬 Unix 계정이 아닌 LDAP 바인딩 계정으로만 사용됩니다.)
Ubuntu는 때때로 AppArmor를 사용하므로 AVC 거부 메시지를 확인하십시오 dmesg
. KDC가 "service.keyfile"을 읽거나 OpenLDAP 소켓에 액세스하는 것이 허용되지 않을 수 있습니다.
또한 stats
LDAP 서버에서 로그 수준을 활성화하여 모든 쿼리를 기록하도록 합니다. 예를 들어 KDC가 다른 DN을 찾고 있음을 나타낼 수 있습니다(일반적으로 "ldap_kerberos_container_dn"은 다른 dbmodules 매개변수 옆에 설정됩니다).
마지막으로 strace kadmin.local
도구가 실제로 LDAP에 연결하지 않고 대신 로컬 db2 파일에 액세스하려고 시도하는 것으로 표시되면 kdc.conf
krb5의 시스템 전체 설정을 재정의하는 구성(KDC 관련 구성 파일)이 있을 수 있습니다. conf. 일반적으로 KDC 구성은 /var/lib/krb5kdc/kdc.conf
krb5.conf 전역 설정에서 로드되며 이 설정보다 우선순위가 높습니다.
(추가로 만약 당신이~이었다kdb5_util create [-s]
db2를 사용하더라도 처음 시작 시 주 데이터베이스가 자동으로 생성되지 않습니다. 이 작업은 "kdb5_ldap_util create"를 사용하여 LDAP 백엔드에 대해 수행한 것처럼 마스터 암호화 키를 실행하고 제공하여 수동으로 수행해야 합니다 .)
해당 문서에는 없지만 다른 곳에서 본 것 중 하나는 "[domain_realm]" 섹션을 만들고 여기에 내 도메인을 추가하는 것인데, 해봤지만 도움이 되지 않았습니다.
이는 영역에 1:1로 매핑되지 않는 호스트 이름에 대한 티켓을 얻을 때 Kerberos 클라이언트에만 필요합니다(일반적인 예는 mit.edu → ATHENA.MIT.EDU). KDC의 창업과는 관련이 없습니다.
/var/log/kerberos에 쓸 수 있도록 systemd 서비스를 수정해야 하는 로깅 섹션을 만들었습니다.
대신 에 로그인하면 그렇지 않습니다 SYSLOG
. 이는 Ubuntu용 시스템 서비스를 작성한 사람의 의도일 가능성이 높습니다.
내 저장소가 LDAP에 있기 때문에 거기에 있지 않습니까?
아니요, /etc/krb5.keytab 파일은 KDC 데이터베이스의 일부가 아닙니다.주인"도메인 구성원"으로 지정되며 시스템 계정의 Kerberos 비밀번호와 동일한 비밀번호를 저장합니다. Kerberos 영역의 각 시스템에는 최소한 주체가 포함된 자체 /etc/krb5.keytab이 있어야 합니다 host/<fqdn>
.
Kerberos 비밀번호가 실제 비밀번호가 되도록 LDAP 패스스루 인증을 작동시키려고 합니다. 많은 문서가 오래된 것으로 나타났습니다. 대부분의 사람들이 내가 설정한 saslauthd를 추천하는 것을 보았지만 지금은 /etc/krb5.keytab을 찾고 있습니다.
OpenLDAP의 경우 예, 일반적으로 saslauthd가 필요합니다.
- 가 있는 DN에 바인딩할 때
userPassword: {SASL}foo@BAR
slapd는 libsasl "비밀번호 확인" 기능을 사용합니다. - 구성된 내용에 따라pwcheck_method, libsasl은 saslauthd에 접속하여 비밀번호를 확인합니다.
- saslauthd는 옵션을 통해 구성된 백엔드를 사용하여
-a
실제 확인을 수행합니다. - 백엔드를 사용하면
-a krb5
saslauthd는 제공된 사용자 이름과 비밀번호(와 동일)를 사용하여 KDC에서 초기 Kerberos 티켓을 얻으려고 시도합니다kinit
. - 초기 티켓을 성공적으로 획득한 경우 saslauthd는 추가로 티켓을 요청합니다.자체 서비스 티켓그리고 시스템의 키 탭을 사용하여 암호 해독을 시도합니다.
- 서비스 이용권을 취득할 수 있는 경우그리고 해독했고,비밀번호가 승인되었습니다.
KDC 스푸핑 공격을 방지하려면 마지막 단계가 필요합니다. 전통적으로 Kerberos KDC는 비밀번호를 확인하지 않고 티켓을 발행했으며(잘못된 비밀번호는 클라이언트가 수신된 티켓을 해독할 수 없음을 의미함) 악의적인 KDC가 여전히 그렇게 할 수 있습니다. 프로토콜 수준에서 "사전 인증"은 필수가 아닙니다. 따라서 saslauthd는 티켓이 합법적인지 확인하기 위해 다른 Kerberos화된 서비스와 동일한 작업을 수행해야 합니다. 즉, 서비스 키 탭을 사용하여 티켓의 암호를 해독하려고 시도합니다. (pam_krb5와 Windows 모두 AD 로그온 중에 동일한 작업을 수행합니다.)
나는 host/hostname.fqdn@REALM과 ldap/hostname.fqdn@REALM을 만들었습니다. LDAP용 키탭을 만들었습니다. 사용자 1명의 패스를 "{SASL}name@REALM"으로 변환했습니다. 해당 사용자에 대해 testaslauthd를 사용하면 성공합니다. 해당 사용자에 대해 ldapsearch를 사용하면 자격 증명이 유효하지 않습니다. ldap이 saslauthd와 통신하지 않는 것 같아요? 여기 "Kerberos 인증" 아래에 구성을 추가했습니다: help.ubuntu.com/community/OpenLDAPServer 그러나 "ldapsearch -Y GSSAPI"를 수행하면 "GSSAPI 오류: 자격 증명이 제공되지 않았습니다...
-Y GSSAPI
~이다직접Kerberos 인증 – saslauthd 및 비밀번호 통과와 완전히 별개입니다. 즉, slapd는 Kerberos 비밀번호조차 받지 않고 Kerberos 비밀번호만 받습니다.티켓서비스 키탭을 기준으로 내부적으로 유효성을 검사합니다.
SASL GSSAPI의 경우 saslauthd가 아닌 slapd 서비스 자체에는
ldap/<fqdn>
. (기본적으로 모든 서비스는 /etc/krb5.keytab 시스템에서 키를 찾지만, 보안을 위해 항목을 별도로 유지하고 slapd의 KRB5_KTNAME을 다른 경로로 설정하는 것이 더 나을 수 있습니다. 이렇게 하면 읽도록 할 필요가 없습니다. 시스템 키탭에 액세스합니다.)클라이언트도 필요합니다.알다 에 대한 티켓을 요청하기 위한 것이므로
ldap/<fqdn>
IP 주소에 연결하면(적절한 rDNS가 설정되지 않은 경우) 작동하지 않을 수 있습니다. 구체적으로 ldap://<fqdn>에 연결해야 합니다. (TLS SNI 또는 TLS 인증서의 호스트 이름과 매우 유사한 문제입니다.)의심스러운 경우
KRB5_TRACE=/dev/stderr
클라이언트를 호출하기 전에 내보내어 TGS-REQ를 만들려는 주체를 파악하세요(또는 KDC 로그 또는 네트워크 캡처 확인).클라이언트는 이미초기의Kerberos 티켓(krbtgt/REALM)이 있어야 합니다. 즉,
kinit
사전에 있어야 합니다. TGT가 아직 없는 경우 Kerberos 클라이언트묻지 않을 것이다귀하의 비밀번호는 즉시 인증에 실패합니다.
ldapsearch -D <user_dn> -W
비밀번호 패스스루는 "단순" 바인드( ) 및 SASL PLAIN 바인드에만 관련됩니다 . "단순" 바인드를 먼저 테스트합니다(대부분 SASL PLAIN을 무시할 수 있음).
답변2
OS에 libsasl2를 설치하고 krb5.keytab에 대한 소유권을 openldap 사용자에게 부여해야 합니다.
데비안에서:
sudo apt 설치 libsasl2-2 libsasl2-modules-gssapi-mit
그런 다음
sudo chown openldap:openldap /etc/krb5.keytab 또는 기타 keytab
편집: 하지만 동일한 머신/컨테이너(여러 서버 포함)에 있는 여러 키탭에 주의하세요.