LDAP Linux Auth SSS: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показано 8 промежуточных версий этого же участника)
Строка 6: Строка 6:
 
[[Категория:Linux]]
 
[[Категория:Linux]]
 
[[Категория:PAM]]
 
[[Категория:PAM]]
[[Категория:ssh]]
+
[[Категория:SSH]]
   
   
 
=SSSD=
 
=SSSD=
 
<BR>
 
<BR>
Изначально задача стояла - сделать авторизацию (shell) в LDAP причем
+
Изначально задача стояла - сделать авторизацию (shell) в LDAP:
  +
* Огромный корпоративный LDAP где куча всяких данных и в целом мне не доступно управление
 
  +
* Огромный корпоративный LDAP где куча всяких данных и в целом мне не доступно управление
* Доступ должен определяться членством в группах (обратить внимание - есть более чем 1 группа, memberOf ко торой должны иметь возможность логиниться на сервер что исключает pam_ldap)
 
  +
* Доступ должен определяться членством в группах (обратить внимание - есть более чем 1 группа, memberOf ко торой должны иметь возможность логиниться на сервер что исключает pam_ldap)
* sudo для этой группы
 
  +
* sudo для этой группы
* sudosh2 для записи сессии
 
  +
* sudosh2 для записи сессии
   
   
Строка 47: Строка 48:
 
head -1 /etc/passwd
 
head -1 /etc/passwd
 
root:x:0:0:root:/root:/usr/bin/sudosh
 
root:x:0:0:root:/root:/usr/bin/sudosh
  +
</PRE>
  +
  +
Включить автосоздание директорий
  +
<PRE>
  +
authconfig --enablemkhomedir --update
 
</PRE>
 
</PRE>
   
Строка 76: Строка 82:
 
dns_resolver_timeout = 15
 
dns_resolver_timeout = 15
   
ldap_search_base = dc=mirantis,dc=net
+
ldap_search_base = dc=MYCOMPANY,dc=net
ldap_access_filter = |(|(&(accessTo=itlab)(trustModel=byhost)(trustModel=fullaccess))(&(objectClass=posixAccount)(uid=mmaxur)))(memberOf=cn=it-cloud-ops,ou=groups,o=mirantis,dc=mirantis,dc=net)
+
ldap_access_filter = |(|(&(accessTo=itlab)(trustModel=byhost)(trustModel=fullaccess))(&(objectClass=posixAccount)(uid=mmaxur)))(memberOf=cn=it-cloud-ops,ou=groups,o=MYCOMPANY,dc=MYCOMPANY,dc=net)
 
cache_credentials = False
 
cache_credentials = False
 
#enumerate = false
 
#enumerate = false
 
enumerate = True
 
enumerate = True
 
sudo_provider = ldap
 
sudo_provider = ldap
ldap_sudo_search_base = ou=sudoers,dc=mirantis,dc=net
+
ldap_sudo_search_base = ou=sudoers,dc=MYCOMPANY,dc=net
 
cache_credentials = True
 
cache_credentials = True
 
ldap_tls_reqcert = never
 
ldap_tls_reqcert = never
Строка 93: Строка 99:
 
[sudo]
 
[sudo]
 
sudo_provider = ldap
 
sudo_provider = ldap
ldap_sudo_search_base = ou=sudoers,dc=mirantis,dc=net
+
ldap_sudo_search_base = ou=sudoers,dc=MYCOMPANY,dc=net
 
</PRE>
 
</PRE>
   
Строка 106: Строка 112:
 
<PRE>
 
<PRE>
 
URI ldap://ldap/
 
URI ldap://ldap/
BASE dc=mirantis,dc=net
+
BASE dc= MYCOMPANY,dc=net
 
</PRE>
 
</PRE>
   
Строка 176: Строка 182:
 
< session optional pam_sss.so
 
< session optional pam_sss.so
 
</PRE>
 
</PRE>
  +
   
 
==sudo==
 
==sudo==
  +
* https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/sssd-ldap-sudo.html
  +
  +
<B> /etc/nsswitch.conf</B>
  +
<PRE>
  +
sudoers: files sss
  +
</PRE>
  +
  +
<B>/etc/sssd/sssd.conf</B>
  +
<PRE>
  +
[sssd]
  +
services = nss,pam,sudo
  +
</PRE>
  +
  +
<B>/etc/sssd/sssd.conf</B>
  +
<PRE>
  +
id_provider = ldap
  +
  +
sudo_provider = ldap
  +
ldap_uri = ldap://example.com
  +
ldap_sudo_search_base = ou=sudoers,dc=example,dc=com
  +
</PRE>
  +
  +
==ssh access using key from ldap==
  +
  +
Если LDAP настроен так как нужно (верная схема) - то можно просто добавить строчку "бери ключ из лдап", бинарник идет вместе с пакето sssd
  +
  +
<PRE>
  +
AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
  +
</PRE>
  +
  +
По сути это комманда которая на вход получает username а на выходе отдает ключ
  +
<BR>
  +
Скрипт который делает то же самое выглядит так:
  +
  +
<PRE>
  +
#!/bin/bash
  +
  +
  +
  +
LOG="/etc/ssh/auth.log"
  +
LDAPSEARCH="/usr/bin/ldapsearch"
  +
WORKDIR=/etc/ssh/ldap_auth
  +
  +
  +
date >> ${LOG}
  +
env >> ${LOG}
  +
echo $@ >> ${LOG}
  +
echo ${1} >> ${LOG}
  +
  +
USER=${1}
  +
  +
  +
pre() {
  +
  +
mkdir -p ${WORKDIR}
  +
TMP_DIR=`mktemp -p ${WORKDIR} -d --suffix="-${USER}"`
  +
  +
  +
}
  +
  +
search_key() {
  +
${LDAPSEARCH} -x -LLL -b "uid=${USER},ou=people,o=MYCOMPANY,dc=MYCOMPANY,dc=net" sshPublicKey -tt -T ${TMP_DIR} 2>&1 >>${LOG}
  +
}
  +
  +
  +
  +
show_key() {
  +
pushd ${TMP_DIR} 2>/dev/null 1>/dev/null
  +
for F in `ls -1 `
  +
do
  +
cat ${F}
  +
cat ${F} >> ${LOG}
  +
done
  +
popd 2>/dev/null 1>/dev/null
  +
}
  +
  +
clanup(){
  +
rm -rf ${TMP_DIR}
  +
  +
}
  +
  +
pre
  +
search_key
  +
show_key
  +
clanup
  +
  +
</PRE>
  +
Тут можно сделать что угодно - использовать нестандартную схему, другой ldap-сервер или что то еще.
  +
  +
=Ссылки=
  +
* https://www.couyon.net/blog/enabling-ldap-usergroup-support-and-authentication-in-centos-6
  +
* https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/sssd-ldap-sudo.html
  +
* https://arthurdejong.org/nss-pam-ldapd/setup
  +
* https://thornelabs.net/2013/01/28/linux-restrict-server-login-via-ldap-groups.html
  +
* http://www.cyberciti.biz/tips/howto-deny-allow-linux-user-group-login.html
  +
https://wiki.gentoo.org/wiki/Centralized_authentication_using_OpenLDAP/ru

Текущая версия на 18:20, 24 июля 2024


SSSD


Изначально задача стояла - сделать авторизацию (shell) в LDAP:

  • Огромный корпоративный LDAP где куча всяких данных и в целом мне не доступно управление
  • Доступ должен определяться членством в группах (обратить внимание - есть более чем 1 группа, memberOf ко торой должны иметь возможность логиниться на сервер что исключает pam_ldap)
  • sudo для этой группы
  • sudosh2 для записи сессии


Пару слов про sssd:


SSSD (System Security Services Daemon) позволяет обращаться к удаленным механизмам аутентификации. Таким образом стирается граница между локальной и сетевой аутентификацией и допускается использование разных механизмов. Информацию о пользователях предоставляет база данных, называемая доменом, которая может служить источником данных для удаленной аутентификации. Допускается использование нескольких механизмов, что разрешает нескольким серверам реализовать различные пространства имен. Полученная информация будет предоставлена внешним приложениям с помощью стандартных интерфейсов PAM и NSS. SSSD выполняется как комплект служб, независимых от вызывающих их приложений. Поэтому приложениям необязательно создавать собственные подключения к удаленным доменам и даже не требуется знать о том, какая именно служба используется в данный момент. Локальное кэширование данных идентификации и информации о группах позволяет продолжать работу в автономном режиме независимо от источника данных (LDAP, NIS, IPA, DB, Samba и т.п.) и в целом повышает производительность. SSSD допускает использование нескольких поставщиков одного типа (например, LDAP). За подробной информацией обратитесь к руководству по развертыванию Red Hat Enterprise Linux 6.


sudosh2

spec есть в комплекте, сборка особого труда не представляет.
https://github.com/squash/sudosh2


rpm -ivh sudosh2-1.0.6-1.el5.x86_64.rpm

/etc/shells

/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/usr/bin/sudosh
head -1 /etc/passwd
root:x:0:0:root:/root:/usr/bin/sudosh

Включить автосоздание директорий

authconfig --enablemkhomedir --update

ldap auth via pam_sss

yum  install sssd-ldap
yum -y install openldap-clients

/etc/sssd/sssd.conf

[sssd]
config_file_version = 2
services = nss, pam, sudo, ssh
domains = default
reconnection_retries = 100

[nss]
default_shell = /bin/sh

[pam]

[domain/default]
ldap_tls_reqcert = never
id_provider = ldap
auth_provider = ldap
access_provider = ldap

ldap_uri = ldap://ldap/
dns_resolver_timeout = 15

ldap_search_base = dc=MYCOMPANY,dc=net
ldap_access_filter =  |(|(&(accessTo=itlab)(trustModel=byhost)(trustModel=fullaccess))(&(objectClass=posixAccount)(uid=mmaxur)))(memberOf=cn=it-cloud-ops,ou=groups,o=MYCOMPANY,dc=MYCOMPANY,dc=net)
cache_credentials = False
#enumerate = false
enumerate = True
sudo_provider = ldap
ldap_sudo_search_base = ou=sudoers,dc=MYCOMPANY,dc=net
cache_credentials = True
ldap_tls_reqcert = never
min_id = 1000
use_fully_qualified_names = False
override_shell = /usr/bin/sudosh

[autofs]

[sudo]
sudo_provider = ldap
ldap_sudo_search_base = ou=sudoers,dc=MYCOMPANY,dc=net


 /etc/init.d/sssd start

 chkconfig sssd on

/etc/openldap/ldap.conf

URI ldap://ldap/
BASE dc= MYCOMPANY,dc=net


cp  -r /etc/pam.d /root
authconfig --enablesssdauth  --enablesssd --update

Проверить: (/root/pam.d - бекап)

[root@ic3-fuel-scc ~]# diff /etc/pam.d/ /root/pam.d/
diff /etc/pam.d/fingerprint-auth /root/pam.d/fingerprint-auth
11d10
< account     [default=bad success=ok user_unknown=ignore] pam_sss.so
20d18
< session     optional      pam_sss.so
diff /etc/pam.d/fingerprint-auth-ac /root/pam.d/fingerprint-auth-ac
11d10
< account     [default=bad success=ok user_unknown=ignore] pam_sss.so
20d18
< session     optional      pam_sss.so
diff /etc/pam.d/password-auth /root/pam.d/password-auth
7d6
< auth        sufficient    pam_sss.so use_first_pass
13d11
< account     [default=bad success=ok user_unknown=ignore] pam_sss.so
18d15
< password    sufficient    pam_sss.so use_authtok
25d21
< session     optional      pam_sss.so
diff /etc/pam.d/password-auth-ac /root/pam.d/password-auth-ac
7d6
< auth        sufficient    pam_sss.so use_first_pass
13d11
< account     [default=bad success=ok user_unknown=ignore] pam_sss.so
18d15
< password    sufficient    pam_sss.so use_authtok
25d21
< session     optional      pam_sss.so
diff /etc/pam.d/smartcard-auth /root/pam.d/smartcard-auth
11d10
< account     [default=bad success=ok user_unknown=ignore] pam_sss.so
20d18
< session     optional      pam_sss.so
diff /etc/pam.d/smartcard-auth-ac /root/pam.d/smartcard-auth-ac
11d10
< account     [default=bad success=ok user_unknown=ignore] pam_sss.so
20d18
< session     optional      pam_sss.so
diff /etc/pam.d/system-auth /root/pam.d/system-auth
7d6
< auth        sufficient    pam_sss.so use_first_pass
13d11
< account     [default=bad success=ok user_unknown=ignore] pam_sss.so
18d15
< password    sufficient    pam_sss.so use_authtok
25d21
< session     optional      pam_sss.so
diff /etc/pam.d/system-auth-ac /root/pam.d/system-auth-ac
7d6
< auth        sufficient    pam_sss.so use_first_pass
13d11
< account     [default=bad success=ok user_unknown=ignore] pam_sss.so
18d15
< password    sufficient    pam_sss.so use_authtok
25d21
< session     optional      pam_sss.so


sudo

/etc/nsswitch.conf

sudoers: files sss

/etc/sssd/sssd.conf

[sssd]
services = nss,pam,sudo

/etc/sssd/sssd.conf

id_provider = ldap

sudo_provider = ldap
ldap_uri = ldap://example.com
ldap_sudo_search_base = ou=sudoers,dc=example,dc=com

ssh access using key from ldap

Если LDAP настроен так как нужно (верная схема) - то можно просто добавить строчку "бери ключ из лдап", бинарник идет вместе с пакето sssd

AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys

По сути это комманда которая на вход получает username а на выходе отдает ключ
Скрипт который делает то же самое выглядит так:

#!/bin/bash



LOG="/etc/ssh/auth.log"
LDAPSEARCH="/usr/bin/ldapsearch"
WORKDIR=/etc/ssh/ldap_auth


date  >> ${LOG}
env  >> ${LOG}
echo $@ >> ${LOG}
echo ${1} >> ${LOG}

USER=${1}


pre() {

  mkdir -p ${WORKDIR}
  TMP_DIR=`mktemp -p ${WORKDIR} -d --suffix="-${USER}"`


}

search_key() {
   ${LDAPSEARCH} -x -LLL -b "uid=${USER},ou=people,o=MYCOMPANY,dc=MYCOMPANY,dc=net" sshPublicKey  -tt -T ${TMP_DIR} 2>&1 >>${LOG}
}



show_key() {
  pushd ${TMP_DIR} 2>/dev/null 1>/dev/null
  for F in `ls -1  `
  do
    cat ${F}
    cat ${F} >> ${LOG}
  done
  popd 2>/dev/null  1>/dev/null
}

clanup(){
  rm -rf ${TMP_DIR}

}

pre
search_key
show_key
clanup

Тут можно сделать что угодно - использовать нестандартную схему, другой ldap-сервер или что то еще.

Ссылки

https://wiki.gentoo.org/wiki/Centralized_authentication_using_OpenLDAP/ru