Шаги ==== Настраиваются 3 сервера (FreeIPA, Keycloak, Forgejo). 1. FreeIPA 1.1. Развернуть FreeIPA сервер. 1.2. На сервере FreeIPA: - Сгенерировать ssh-ключ: # ssh-keygen -t ed25519 -N '' -f ~/.ssh/ed25519 && cat ~/.ssh/ed25519.pub - Добавить выведенный публичный ssh ключ для пользователя (например) testuser в веб-интерфейсе FreeIPA > Сохранить - Инициализировать билет kerberos для testuser и заодно изменить пароль: # kinit testuser 2. Keycloak 2.1. # apt-get install -y postgresql-server keycloak 2.2. Настроить базу данных postgresql и создать пользователя: # /etc/init.d/postgresql initdb # systemctl enable --now postgresql && sleep 5; systemctl status postgresql -l --no-pager # psql -U postgres -c "CREATE USER keycloak WITH PASSWORD '12345678';" && \ psql -U postgres -c "CREATE DATABASE keycloak OWNER keycloak;" && \ psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE keycloak TO keycloak;" 2.3. Отключить сервис ahttpd (в случае, если установлен): # systemctl stop ahttpd 2.4. Настроить конфигурационный файл: # cp /etc/keycloak/keycloak.conf /etc/keycloak/keycloak.conf-orig && sed -i -e "s|#db=postgres|db=postgres|g" \ -e "s|#db-username=keycloak|db-username=keycloak|g" \ -e "s|#db-password=password|db-password=12345678|g" \ -e "s|#db-url=jdbc:postgresql://localhost/keycloak|db-url=jdbc:postgresql://localhost/keycloak|g" \ -e "s|#health-enabled=true|health-enabled=true|g" \ -e "s|#metrics-enabled=true|metrics-enabled=true|g" \ -e "s|#hostname=myhostname|hostname=$(hostname -i)|g" \ /etc/keycloak/keycloak.conf && diff -u --color /etc/keycloak/keycloak.conf-orig /etc/keycloak/keycloak.conf 2.5. Создать файл san.cnf # cat << EOF > san.cnf [req] distinguished_name = req_distinguished_name x509_extensions = v3_req prompt = no [req_distinguished_name] CN = $(hostname -i) [v3_req] keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = IP:$(hostname -i) EOF 2.6. Сгенерировать сертификаты и ключи: # openssl req -x509 -newkey rsa:4096 -keyout /var/lib/ssl/private/keycloak.key -out /var/lib/ssl/certs/keycloak.crt -days 365 -nodes -config san.cnf 2.7. Изменить конфиг: # sed -i -e 's|https-certificate-file=/var/lib/ssl/certs/keycloak.pem|https-certificate-file=/var/lib/ssl/certs/keycloak.crt|' -e 's|https-certificate-key-file=/var/lib/ssl/private/keycloak.pem|https-certificate-key-file=/var/lib/ssl/private/keycloak.key|' /etc/keycloak/keycloak.conf 2.8. Создать пользователя администратора: # kc.sh bootstrap-admin user - На запрос логина/пароля ввести: admin/admin 2.9. Запустить сервис keycloak: # systemctl enable --now keycloak.service && sleep 5; systemctl status keycloak.service -l --no-pager 2.10. Открыть в браузере страницу по полученной ссылке: # echo "https://$(hostname -i):8443" 2.11. Авторизоваться созданным ранее пользователем admin 2.12. Создать новый realm > Нажать Keycloak master > Create Realm > realm name: forgejo 2.13. Настроить LDAP: - Добавить в /etc/hosts на сервере keycloak # echo '<ipservfreeipa> dc.freeipa.testdomain' >> /etc/hosts - В веб-интерфейсе keycloak перейти User federation > Add LDAP provides. Заполнить данные: UI display name: dc.freeipa.testdomain Vendor: Red Hat Directory Server Connection URL: ldap://dc.freeipa.testdomain Bind type: simple Bind DN: uid=admin,cn=users,cn=accounts,dc=freeipa,dc=testdomain Bind credentials: <FreeIPA admin password> Edit mode: Read_ONLY Users DN: cn=users,cn=accounts,dc=freeipa,dc=testdomain Username LDAP attribute: uid RDN LDAP attribute: uid UUID LDAP attribute: uid User object classes: inetOrgPerson, organizationalPerson, person, top - Нажать Save - Перейти в созданного провайдера > Action > Sync all users - Перейти во вкладку Users, в поиске ввести *, выполнить поиск - Выбрать пользователя testuser > Role mapping > Assign role, добавить во все роли 2.14. Настроить Mappers на получение ssh ключей с сервера FreeIPA - Перейти в User federation > Перейти в созданный LDAP provides > Mappers > Add mapper Name: SshPubKey Mapper type: user-attribute-ldap-mapper User Model Attribute: SshPubKey LDAP Attribute: ipaSshPubKey Always Read Value From LDAP: ON - Save - Перейти в settings > Action > Sync all users 2.15. Создать Client Clients > Create client Client type : «OpenID Connect» Client ID : forgejo Далее Client authentication: On Далее Valid redirect URIs: * Valid post logout redirect URIs: http://<forgejo_ip>:3000/* Web origins: http://<forgejo_ip>:3000/ - Сохранить - Перейти во вкладку Credentials и скопировать себе Client Secret, нужен будет позже 2.16. Создать Client Scope - Client Scope > Create client scope name: sshpubkey Include in token scope: On - Save 2.17. Перейти в созданный Client scope > mappers > Configure a new mapper > User Attribute name: sshpubkey User Attribute: SshPubKey Token Claim Name: sshpubkey Активировать Multivalued 2.18. Назначить клиенту созданный Client scope - Clients > forgejo > Client Scope > Add client scope > Выбрать созданный client scope sshpubkey > Add > Optional 3. Forgejo # apt-get install -y forgejo && \ systemctl enable --now forgejo && sleep 5 && systemctl status forgejo --no-pager -l && \ echo "http://$(hostname -i):3000" - Войти в веб-интерфейс Forgejo, указать: Тип базы данных: SQLite3 Внизу страницы: Учётная запись администратора -> Задать имя altadmin, пароль 12345678 и email test@example.org Нажать Установить Forgejo # sed -i 's/DISABLE_REGISTRATION = true/DISABLE_REGISTRATION = false/' /etc/forgejo/app.ini && \ scp root@<keycloak_ip>:/var/lib/ssl/certs/keycloak.crt ~/ && \ cat keycloak.crt | tee -a /usr/share/ca-certificates/ca-bundle.crt && \ systemctl restart forgejo - Перейти в значок профиля > Панель управления > Идентификация и доступ > Аутентификация > Добавить новый источник Тип аутентификации: OAuth2 Название аутентификации: Keycloak Поставщик OAuth2: OpenID Connect ID клиента (ключ): forgejo Клиентский ключ: вставить раннее скопированный ключ с keycloak'a OpenID Connect URL для автоматизации входа: https://<ip_keycloak>:8443/realms/forgejo/.well-known/openid-configuration Дополнительные разрешения: sshpubkey Атрибут открытого ключа SSH: sshpubkey Нажать Создать источник аутентификации - Выйти из учетной записи администратора - Вход > Войти через Keycloak > войти > нажать Завершить регистрацию - Перейти в Настройки > Ключи SSH Фактический результат ===================== Ключа нет. Ожидаемый результат =================== Ключ должен появляться сразу. Дополнительно ============= Если выйти и войти заново пользователем, ключ появится. Воспроизводимость ================= Воспроизводится на виртуальных машинах: [sisyphus] ALT Server 11.0 beta20250213 x86_64 [p11+381621] ALT Server 11.0 beta20250213 x86_64 forgejo-11.0.1-alt1.x86_64 [p11] ALT Server 11.0 beta20250213 x86_64 forgejo-10.0.1-alt2.x86_64 Сервера keycloak и freeipa: [p11 = p11+381621] ALT Server 11.0 beta20250213 x86_64 freeipa-server-4.12.3-alt2.x86_64 keycloak-26.2.0-alt1.x86_64
Ошибка актуальна для версии keycloak-26.5.2-alt1