LDAP Linux Auth SSS: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
(не показано 8 промежуточных версий этого же участника) | |||
Строка 6: | Строка 6: | ||
[[Категория:Linux]] |
[[Категория:Linux]] |
||
[[Категория:PAM]] |
[[Категория:PAM]] |
||
− | [[Категория: |
+ | [[Категория: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= |
+ | 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= |
+ | 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= |
+ | 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= |
+ | ldap_sudo_search_base = ou=sudoers,dc=MYCOMPANY,dc=net |
</PRE> |
</PRE> |
||
Строка 106: | Строка 112: | ||
<PRE> |
<PRE> |
||
URI ldap://ldap/ |
URI ldap://ldap/ |
||
− | BASE dc= |
+ | 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://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