Страницы

Сохранить статью у себя в соцсети:

четверг, 21 ноября 2013 г.

§ OpenSSH-6.x and AuthorizedKeysCommand.

OpenSSH-6.x and AuthorizedKeysCommand 

Относительно недавно в OpenSSH появилась поддержка внешних агентов выполняющих проверку информации о пользователе. Это очень удобно, потому что можно написать свой агент который будет удовлетворять всем необходимым требования. Это очень гибкое и удобное решение. Зачем это было нужно в моем случае:
  • Пользователи и их ключи хранятся в LDAP каталоге. 
  • Проверка ключей осуществляется через использование OpenSSH c LPK патчами. Однако мне до конца непонятно будущее проекта и неизвестно будут ли майнтэйнеры OpenSSH в Gentoo Linux поддерживать интеграцию этих патчей.
  • появления AuthorizedKeysCommand в openssh-6.2 ознаменовало что можно отказаться от LPK и сделать свой инструмент который будет проверять пользовательскую информацию в LDAP (ключи, принадлежность группам и все все все).
  • Появилась возможность проверки пользователей во вложенных группах на стороне LDAP каталога. Теперь нет необходимости перечислять все пользователей в каждой группе. Можно завести одну группу и затем подключать ее в другие группы всего одной записью.
  • В LPK была возможность давать доступ к серверу при условии что пользователь является участником определенной группы в LDAP. Это мне нужно было сохранить.
Вот такие требования заставили отказаться от LPK в пользу написания своего агента.
Для начала нужно выполнить некоторые правки на стороне LDAP сервера. Подгружаем дополнительную схему которая позволит использовать uniqueMember атрибут в posixGroup'ах. Это нужно для использования вложенных групп.
# vi /etc/openldap/schema/extendedgroup.schema 
objectclass ( 1.3.6.1.4.1.35312.1 NAME 'extendedGroup'
        DESC 'adds uniqueMember attribut for groups'
        SUP top AUXILIARY
        MAY ( uniqueMember ) )

Правим slapd.conf, где указываем использования дополнительной схемы
# vi /etc/openldap/slapd.conf
include         /etc/openldap/schema/extendedgroup.schema

Теперь перезапускаем slapd и переходим к настройке групп. Итак у нас есть
  1. группа пользователей (admins), которую мы хотим привязать к целевой группе (staging), при этом мы не хотим перечислять каждого участника группы admins в целевой группе staging (такая вот тавтология, но суть одна - вложенные группы). 
  2. и есть та самая группа staging, на участие в которой проверяется пользователь.
Группа которая должна ходить на любые сервера - admins
dn: cn=admins,ou=roles,ou=people,dc=thislinux,dc=org
cn: admins
gidNumber: 5000
objectClass: extendedGroup
objectClass: posixGroup
uniqueMember: uid=ivanov,ou=accounts,ou=people,dc=thislinux,dc=org
uniqueMember: uid=lesovsky,ou=accounts,ou=people,dc=thislinux,dc=org
uniqueMember: uid=petrov,ou=accounts,ou=people,dc=thislinux,dc=org
uniqueMember: uid=sidorov,ou=accounts,ou=people,dc=thislinux,dc=org

2) группа staging в которой с помощью uniqueMember перечисляем конкретных пользователей, а также добавляем группу admins, участники которой будут принадлежать группе staging и смогут успешно проходить проверку на принадлежность этой группе. Добавив группу admins нам не придется явно добавлять каждого пользователя в группу staging.
dn: cn=staging,ou=projects,dc=thislinux,dc=org
cn: staging
gidNumber: 2100
objectClass: extendedGroup
objectClass: posixGroup
uniqueMember: cn=admins,ou=roles,ou=people,dc=thislinux,dc=org
uniqueMember: uid=buharina,ou=accounts,ou=people,dc=thislinux,dc=org
uniqueMember: uid=pohmelkina,ou=accounts,ou=people,dc=thislinux,dc=org

Теперь настраиваем сервер. Устанавливаем там openssh-6.2 и добавляем в sshd_config следующие параметры:
# vi /etc/ssh/sshd_config
AuthorizedKeysCommand /usr/libexec/openssh/openssh-ldap-publickey
AuthorizedKeysCommandUser root

Путь может отличаться, это не обязательное условие.
Теперь сам скрипт - агент. При попытке авторизации, скрипту передается логин пользователя. Скрипт читает файл конфигурации и обращается к LDAP серверу для выполнения проверок. Он проверяет наличие пользователя в группе и если указанный логин является участником группы, то выполняется проверка наличия ключа. Если ключ есть то пользователю разрешено авторизоваться. При невыполнении проверок пользователю будет отказано в доступе.

Файл конфигурации который будет использовать агентом аутентификации
# vi /etc/ldap.conf
uri ldap://ldap1.thislinux.org ldap://ldap2.thislinux.org
binddn cn=checkrole,ou=accounts,ou=people,dc=thislinux,dc=org
bindpw secret_password
base dc=thislinux,dc=org
account_base ou=accounts,ou=people,dc=railsc,dc=ru
group_base ou=projects,dc=railsc,dc=ru
account_filter objectClass=posixAccount
server_group staging
pubkey_attr sshPublicKey

uri - к этим серверам осуществляется подключение с целью дальнейшей проверки пользователя. Обязательный параметр.
binddn - здесь указывает роль которая осуществляет подключение, если запрещена анонимный доступ к LDAP. Опциональный параметр.
bindpw - здесь определяется пароль для этой учетной записи.  Опциональный параметр.
base - здесь указывается base dn по умолчанию. Обязательный параметр.
account_base - здесь указывается путь поиска учетных записей пользователей, если не указано используется путь указанный в base. Опциональный параметр.
group_base - здесь указывается путь поиска записей для групп, если не указано используется путь указанный в base. Опциональный параметр.
account_filter - это фильтр по которому осуществляется поиск пользовательских учтеных записей, по умолчанию objectClass=posixAccount. Опциональный параметр.
server_group - это группа в которой нужно искать пользователя. если пользователь не является участником этой группы, ему запрещается доступ к серверу. если группа не указывает проверка не осуществляется. Опциональный параметр.
pubkey_attr - это атрибут по котрому осуществляется поиск ключа, по умолчанию sshPublicKey. Опциональный параметр.

Теперь сам скрипт являющийся агентом аутентификации, его можно скачать отсюда

Делаем скрипт исполняемым с chmod и выполняем перезапуск sshd демона, после чего пробуем подключиться к серверу под учетной записью которая является участником группы staging.

Также при возникновении проблем, для проверки работоспособности можно выполнить скрипт передав ему имя пользователя. Правильным ответом будет возвращение ключа:

# /usr/libexec/openssh/openssh-ldap-publickey testuser
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAuvx8QK4zjtGOOXLPsBUAdcIQX6oFGeHijYAx1faWnaFuc5ua2OXLPsBUAdcIQX6oFGeHijYAx1faWnaFuc5ua2RVvhJGOZ7tP+LluUxSWUAQLtn4VmxpEwmq3ECAnL3E8deg1GRRVvhJGOZ7tP+LluUxSWUAQLtn4VmxpEwmq3ECAnL3E8deg1GRXLPsBUAxaA6/YA/wMM= testuser

Вот и все. Скрипт доступен здесь.
Еще по этой теме: настройка авторизации в LDAP для SSH и SUDO
На главную "Virtualizing Linux"

Комментариев нет:

Отправить комментарий

Популярные сообщения

Профиль в Google+ Яндекс цитирования Яндекс.Метрика