Bug 54389 - SSH-ключ из OpenID (<- Keycloak <- FreeIPA) не загружается при регистрации учётной записи, только при повторном входе
Summary: SSH-ключ из OpenID (<- Keycloak <- FreeIPA) не загружается при регистрации уч...
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: forgejo (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Alexey Shabalin
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-05-20 17:12 MSK by Artem Varaksa
Modified: 2026-02-02 16:36 MSK (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Artem Varaksa 2025-05-20 17:12:20 MSK
Шаги
====

Настраиваются 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
Comment 1 Иванов Александр Владимирович 2026-02-02 16:36:12 MSK
Ошибка актуальна для версии keycloak-26.5.2-alt1