Kerberos LDAP backend, uživatelé v LDAP, SSH přihlašování bez hesla Kerberos ticketem

Kerberos LDAP backend, uživatelé v LDAP,  SSH přihlašování bez hesla Kerberos ticketem
https://wiki.ubuntu.com/Enterprise/Authentication/sssd
https://help.ubuntu.com/community/SingleSignOn
https://help.ubuntu.com/lts/serverguide/openldap-server.html
http://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_ldap.html
https://fedorahosted.org/sssd/wiki/DesignDocs/NSSWithKerberosPrincipal

Na serverech, kde se chci přihlašovat (takže jak na LDAP/Kerberos serveru, tak na klientech):
sudo apt-get -y install sssd libpam-sss libnss-sss sssd-tools

vi /etc/sssd/sssd.conf
[sssd]
config_file_version = 2
services = nss, pam, ssh, sudo
domains = cesal.cz

[nss]
debug_level = 7
filter_users = root,lightdm,ldap,named,avahi,haldaemon,dbus,radvd,tomcat,radiusd,news,mailman,nscd
filter_groups = root

[pam]
pam_verbosity = 3
debug_level = 9

[sudo]

[domain/cesal.cz]
debug_level = 7

chpass_provider = krb5

id_provider = ldap
ldap_uri = ldap://ldap.cesal.cz

ldap_search_base = dc=cesal,dc=cz
ldap_user_principal = krbPrincipalName

sudo_provider = ldap
ldap_sudo_search_base = ou=Sudoers,ou=Apps,dc=cesal,dc=cz
ldap_sudo_full_refresh_interval=86400
ldap_sudo_smart_refresh_interval=3600

auth_provider = krb5
krb5_realm = CESAL.CZ
krb5_server = ldap.cesal.cz
krb5_kpasswd = ldap.cesal.cz
cache_credentials = true

enumerate = false
vi /etc/nsswitch.conf
passwd: files sss
group: files sss
shadow: files sss
sudoers: files sss
publickey: files
hosts: files dns myhostname
networks: files
protocols: files
services: files
ethers: files
rpc: files
netgroup: files

 

Upravit práva a spustit
chmod 700 /etc/sssd/sssd.conf && chown root:root /etc/sssd/sssd.conf
systemctl restart sssd

———

Nainstalovat OpenLDAP server – už jen samozřejmě na LDAP serveru
sudo apt-get -y install slapd ldap-utils sasl2-bin libsasl2-2 libsasl2-modules libsasl2-modules-gssapi-mit

Kontrola
sudo ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config

Naplnění LDAP databáze

containers.ldif
dn: ou=Users,dc=cesal,dc=cz
objectClass: top
objectClass: organizationalUnit
ou: Users
description: Uživatelské účty

dn: ou=Groups,dc=cesal,dc=cz
objectClass: top
objectClass: organizationalUnit
ou: Groups
description: Uživatelské skupiny

dn: ou=Computers,dc=cesal,dc=cz
objectClass: top
objectClass: organizationalUnit
ou: Groups
description: Počítače

dn: ou=Apps,dc=cesal,dc=cz
objectClass: top
objectClass: organizationalUnit
ou: Groups
description: Aplikace
ldapadd -x -D cn=admin,dc=cesal,dc=cz -W -f containers.ldif 
groups.ldif
dn: cn=Administrators,ou=Groups,dc=cesal,dc=cz
objectClass: posixGroup
cn: Administrators
gidNumber: 5000

dn: cn=Users,ou=Groups,dc=cesal,dc=cz
objectClass: posixGroup
cn: Users
gidNumber: 5001
ldapadd -x -D cn=admin,dc=cesal,dc=cz -W -f groups.ldif

Logování
logging.ldif

dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: stats

ldapmodify -Y EXTERNAL -H ldapi:/// -f logging.ldif

Indexování - index_ldap.ldif - možná používáte MDB, tak změnit na mdb:
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcDbIndex
olcDbIndex: uid,uidNumber,gidNumber,memberUid,uniqueMember,objectClass,cn eq

ldapmodify -Y EXTERNAL -H ldapi:/// -f index_ldap.ldif


access.ldif - Přístup administrátora

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcAccess
olcAccess: to * by dn=“cn=admin,dc=cesal,dc=cz“

ldapmodify -Y EXTERNAL -H ldapi:/// -f access.ldif

 

Přeindexovat a spustit OpenLDAP

sudo service slapd stop
sudo su - openldap -c slapindex
sudo service slapd start

 

 

Instalace Kerbera – na serveru

sudo apt-get -y install krb5-{admin-server,kdc} krb5-kdc-ldap

Říše: CESAL.CZ

zcat /usr/share/doc/krb5-kdc-ldap/kerberos.schema.gz >/etc/ldap/schema/kerberos.schema
echo "include /etc/ldap/schema/kerberos.schema" > schema_convert.conf
mkdir /tmp/ldif_output
slaptest -f schema_convert.conf -F /tmp/ldif_output/

Edit the file  /tmp/ldif_output/cn\=config/cn\=schema/cn\=\{0\}kerberos.ldif .

  • In the first (if you count the comments then the fourth) line change dn: cn={0}kerberos to dn: cn=kerberos,cn=schema,cn=config .
  • In the third (with comments: fith) line from the line cn: {0}kerberos leave only cn: kerberos .
  • Remove the last seven lines (starting from: structuralObjectClass: olcSchemaConfig)
ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/ldif_output/cn\=config/cn\=schema/cn\=\{0\}kerberos.ldif

 

vi /etc/krb5.conf (server)

[libdefaults]
 default_realm = CESAL.CZ
noaddresses = true
forwardable = true
 proxiable = true
k5login_directory = /usr/share/ssh/%u
k5login_authoritative = true
ignore_acceptor_hostname = true

[realms]
 CESAL.CZ = {
 kdc = ldap.cesal.cz
 admin_server = ldap.cesal.cz
 default_domain = cesal.cz
 database_module = openldap_cesal
 }

[domain_realm]
 .cesal.cz = CESAL.CZ
 cesal.cz = CESAL.CZ

[dbdefaults]
 ldap_kerberos_container_dn = cn=krbcontainer,dc=cesal,dc=cz

[dbmodules]
 openldap_cesal = {
 db_library = kldap
 ldap_kdc_dn = "cn=admin,dc=cesal,dc=cz"
 ldap_kadmind_dn = "cn=admin,dc=cesal,dc=cz"
 ldap_service_password_file = /etc/krb5kdc/service.keyfile
 ldap_servers = ldap://ldap.cesal.cz
 ldap_conns_per_server = 5
 }

[plugins]
 localauth = {
 module = sssd:/usr/lib/x86_64-linux-gnu/sssd/modules/sssd_krb5_localauth_plugin.so
 enable_only = sssd
 }

[logging]
 kdc = SYSLOG:info:local1
 admin-server = SYSLOG:info:local2
 default = SYSLOG:err:auth

 

sudo kdb5_ldap_util -D cn=admin,dc=cesal,dc=cz create -subtrees ou=Users,dc=cesal,dc=cz -r CESAL.CZ -s

Vymyslet si nějaké heslo pro Kerbera (složité).

 

Kerberos potřebuje heslo pro přístup k LDAPu, bere si ho z /etc/krb5kdc/service.keyfile:

kdb5_ldap_util -D cn=admin,dc=cesal,dc=cz stashsrvpw -f /etc/krb5kdc/service.keyfile cn=admin,dc=cesal,dc=cz

 

kadmin.local - vytvořit pravidla a přidat admin uživatele krbadmin:

add_policy -minlength 8 -minclasses 2 admin
add_policy -minlength 8 -minclasses 2 host
add_policy -minlength 8 -minclasses 2 service
add_policy -minlength 8 -minclasses 2 user
addprinc -policy admin krbadmin/admin

Přidat práva přístupu
cat /etc/krb5kdc/kdc.conf|grep acl_file

*/admin@CESAL.CZ *
*/*@CESAL.CZ i
*@CESAL.CZ i
Restartovat
sudo service krb5-kdc restart
sudo service krb5-admin-server restart

Zkouška
kadmin -p krbadmin/admin
listprincs

 

Na serveru i klientovi – vi /etc/ldap/ldap.conf

apt-get -y install ldap-utils

BASE dc=cesal,dc=cz
URI ldap://ldap.cesal.cz ldap://ldap.cesal.cz:666
SASL_MECH GSSAPI
SASL_REALM CESAL.CZ
TLS_REQCERT allow

 

Kerberos na klientovi

apt-get -y install krb5-user

vi /etc/krb5.conf (klient)

[libdefaults]
 default_realm = CESAL.CZ
noaddresses = true
forwardable = true
 proxiable = true

[realms]
 CESAL.CZ = {
 admin_server = ldap.cesal.cz
 }

Na klientovi zkouška
kinit -p krbadmin/admin
klist

TLS/SSL zabezpečení LDAP

Pro autentizaci přes Kerberos a autorizaci přes LDAP není zabezpečení třeba. Ale při komunikaci přes internetu je vhodné zabezpečení použít.

Získání certifikátu

Použijeme nejnovější autoritu Let’s Encrypt, která je zároveň důvěryhodná.

apt-get install git

openssl genrsa 4096 > user.key
openssl rsa -in user.key -pubout > user.pub
openssl genrsa 4096 > ldap.cesal.cz.key
openssl req -new -sha256 -key ldap.cesal.cz.key -subj "/CN=ldap.cesal.cz" > ldap.cesal.cz.csr
git clone https://github.com/diafygi/letsencrypt-nosudo enc
python ./enc/sign_csr.py --public-key user.pub ldap.cesal.cz.csr > ldap.cesal.cz.signed.crt

Musíte dočasně povolit přístup přes port 80 na cílový počítač (ldap.cesal.cz). Nejen v NATu, ale také v iptables.

Kontrola vydaného certifikátu

openssl x509 -in ldap.cesal.cz.signed.crt -noout -text

Nastavení certifikátu v LDAPu (LDAP server)

wget https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem /etc/ssl/certs/
chmod 777 /etc/ssl/certs/lets-encrypt-x1-cross-signed.pem

mkdir /etc/ldap/ssl/
mv ldap.cesal.cz.signed.crt /etc/ldap/ssl/
mv ldap.cesal.cz.key /etc/ldap/ssl/
chown openldap:openldap /etc/ldap -R && chmod 770 /etc/ldap -R

ssl.ldif
dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: NORMAL
-
add: olcTLSCRLCheck
olcTLSCRLCheck: none
-
add: olcTLSVerifyClient
olcTLSVerifyClient: never
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/ldap.cesal.cz.signed.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap.cesal.cz.key
-
add: olcSecurity
olcSecurity: tls=1

ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif -v

/etc/default/slapd
SLAPD_SERVICES=“ldap:/// ldapi:/// ldaps:///“

service slapd restart
netstat -tualpn -A inet| grep ‚LISTEN‘ |egrep „636|389“

Do /etc/ldap/ldap.conf
TLS_REQCERT allow

ldapsearch -d 9 -D „cn=admin,dc=cesal,dc=cz“ -W -b „dc=cesal,dc=cz“ -H „ldaps://ldap.cesal.cz“ „objectClass=*“

Nastavení u klienta

ldap_tls_reqcert = demand
ldap_uri = ldaps://ldap.cesal.cz
Pak je možné na LDAP serveru zakázat také port 389. Nechat povolený jen zabezpečený 636. Ale to vám zase nebude fungovat STARTTLS: )

 

Přidání klíčů do keytabs

Server – LDAP
kadmin -p krbadmin/admin
addprinc -policy service -randkey ldap/ldap.cesal.cz@CESAL.CZ
ktadd -k /etc/ldap/ldap.keytab ldap/ldap.cesal.cz@CESAL.CZ

chown openldap:openldap /etc/ldap -R && chmod 770 /etc/ldap -R

/etc/default/slapd
export KRB5_KTNAME=/etc/ldap/ldap.keytab

service slapd restart

Server – host key

kadmin -p krbadmin/admin
addprinc -policy host -randkey host/ldap.cesal.cz@CESAL.CZ
ktadd -k /etc/krb5.keytab host/ldap.cesal.cz@CESAL.CZ

 

Klient – host key (provést na klientovi)

kadmin -p krbadmin/admin
addprinc -policy host -randkey host/dev.cesal.cz@CESAL.CZ
ktadd -k /etc/krb5.keytab host/dev.cesal.cz@CESAL.CZ

 

Vytvoření uživatelů

Uživatel petr v LDAP:
adduser.ldif
dn: uid=petr,ou=Users,dc=cesal,dc=cz
cn: Petr Novák
givenName: Petr
uid: petr
uidNumber: 10001
gidNumber: 5001
homeDirectory: /home/petr
mail: petr@mail.local
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
ldapadd -x -D cn=admin,dc=cesal,dc=cz -W -f adduser.ldif

Uživatel petr v Kerberosu:
addprinc -policy user -x dn="uid=petr,ou=Users,dc=cesal,dc=cz" petr

If the user object is already created the -x dn="..." option is needed to add the Kerberos attributes. Otherwise a new principal object will be created in the realm subtree.
Takže se nepřidá další principal v krbcontainer, ale jen se přidají Kerberos parametry do ou=Users,uid=petr. Tak je to správně.

SSH přihlašování

vi /etc/ssh/sshd_config (server – démon)

GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes

vi /etc/ssh/ssh_config (klient)

GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes

Nyní by mělo fungovat přihlášení bez hesla (pokud jste přihlášeni do Kerberosu přes kinit). Musíte mít také SSSD nainstalované.

Automatické vytvoření domovského adresáře

/etc/pam.d/common-session by hand and adding the following line before any pam_ldap and pam_krb5 settings:

session required        pam_mkhomedir.so umask=0022 skel=/etc/skel

 

SUDO – přidat schéma do LDAPu

Zkopírovat schéma z https://www.sudo.ws/man/1.8.14/sudoers.ldap.man.html#x4558414d504c4553 do /etc/ldap/schema/sudoers.schema .

echo "include /etc/ldap/schema/sudoers.schema" > schema_convert.conf
mkdir /tmp/sudo_ldif
slaptest -f schema_convert.conf -F /tmp/sudo_ldif/

Edit the file /tmp/sudo_ldif/cn=config/cn=schema/cn\=\{0\}sudoers.ldif .
  • In the first (if you count the comments then the fourth) line change dn: cn={0}sudoers to dn: cn=sudoers,cn=schema,cn=config .
  • In the third (with comments: fith) line from the line cn: {0}sudoers leave only cn: sudoers .
  • Remove the last seven lines (starting from: structuralObjectClass: olcSchemaConfig)
ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/sudo_ldif/cn=config/cn=schema/cn\=\{0\}sudoers.ldif

SUDO - vytvořit strukturu
vi sudo_ou.ldif
dn: ou=Sudoers,ou=Apps,dc=cesal,dc=cz
objectClass: top
objectClass: organizationalUnit
ou: Sudoers
description: Sudoers container
ldapadd -x -D cn=admin,dc=cesal,dc=cz -W -f sudo_ou.ldif 

Do /etc/ldap/ldap.conf přidat:
SUDOERS_BASE ou=Sudoers,ou=Apps,dc=cesal,dc=cz
SUDOERS_TIMED no
SUDOERS_DEBUG 0

Nezapomenout to mít také v /etc/nsswitch.conf

SUDO - indexovat
Indexování - index_ldap.ldif - možná používáte MDB, tak změnit na mdb:
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcDbIndex
olcDbIndex: uid,uidNumber,gidNumber,memberUid,uniqueMember,objectClass,cn,sudoUser eq
SUDO - přidat pravidla
add_sudoers.ldif
dn: cn=root,ou=Sudoers,ou=Apps,dc=cesal,dc=cz
objectClass: top
objectClass: sudoRole
cn: root
sudoUser: root
sudoHost: ALL
sudoCommand: ALL
dn: cn=%Administrators,ou=Sudoers,ou=Apps,dc=cesal,dc=cz
objectClass: top
objectClass: sudoRole
cn: %Administrators
sudoUser: %Administrators
sudoHost: ALL
sudoCommand: ALL
ldapadd -x -D cn=admin,dc=cesal,dc=cz -W -f add_sudoers.ldif

Zjistit, do jaké skupiny uživatel patří: id

Další..: )