ansheng’s blog!

Gogs Docker化部署以及配置LDAP(FreeIPA)认证

Gogs是一款极易搭建的自助Git服务,相比GitLab,它已经非常轻量级了。

安装

关于FreeIPA Server端的部署你可以参考CentOS部署FreeIPA Server和FreeIPA Client,这次使用的FreeIPA Server端IP为95.179.246.183.

创建部署目录

$ mkdir -p ~/deploy/git

创建docker-compose.yml文件

$ vi ~/deploy/git/docker-compose.yml
version: "3.8"

services:
  gogs:
    image: gogs/gogs
    restart: always
    # 应该添加DNS记录的,但是我在服务器上面没有调通
    # dns:
    #   - 95.179.246.183
    #   - 8.8.8.8
    # 添加hosts记录
    extra_hosts:
      - "ipa.corp.ansheng.me:95.179.246.183"
    ports:
      # SSH 端口
      - "10022:22"
      # Web端口
      - "10080:3000"
    volumes:
      # 数据挂在目录
      - ./data:/data

通过docker-compose运行服务

$ cd ~/deploy/git/
$ docker-compose up -d

当启动完成之后我们打开:http://45.77.54.234:10080/进行初始化操作,因为我的Gogs服务器IP是45.77.54.234,请把这个IP替换为你自己的服务器IP

Untitled

为了方便测试,上面的数据库我用的是SQLite3,域名填写当前的IP地址,SSH端口号填写我们映射出来的10022端口,应用URL改为当前页面的URL,我这里还创建了一个管理员账号并且禁止注册。

为了方便调试,我们把gogs的日志级别改为TRACE模式

vi ~/deploy/git/data/gogs/conf/app.ini
......
LEVEL     = TRACE
......
$ docker-compose restart

配置LDAP(FreeIPA)认证

我们需要切换到FreeIPA Server端创建一个gogs用户和staff组

只要加入到改组的用户都可以登陆gogs

$ ipa group-add --desc="Staff" staff
-----------
已添加组"staff"
-----------
  组名: staff
  描述: Staff
  GID: 139600003

创建gogs.ldif文件,这里的配置只需要修改DC部分

$ vi gogs.ldif
dn: uid=gogs,cn=sysaccounts,cn=etc,dc=corp,dc=ansheng,dc=me
changetype: add
objectclass: account
objectclass: simplesecurityobject
uid: gogs
userPassword: secure-password
passwordExpirationTime: 20380119031407Z
nsIdleTimeout: 0

通过ldapmodify导入,系统将提示输入目录管理员密码:

$ ldapmodify -h ipa.corp.ansheng.me -p 389 -x -D "cn=Directory Manager" -W -f gogs.ldif
Enter LDAP Password: # 输入目录管理员密码
adding new entry "uid=gogs,cn=sysaccounts,cn=etc,dc=corp,dc=ansheng,dc=me"

$ ipa user-add gogs --first=Gogs --last=Gogs --random
-----------
已添加用户"gogs"
-----------
  用户登录名: gogs
  名: Gogs
  姓: Gogs
  全名: Gogs Gogs
  显示名称: Gogs Gogs
  名字的首字母: GG
  主目录: /home/gogs
  GECOS: Gogs Gogs
  登录shell: /bin/sh
  主机名: gogs@CORP.ANSHENG.ME
  主体别名: gogs@CORP.ANSHENG.ME
  User password expiration: 20201120090543Z
  邮件地址: gogs@corp.ansheng.me
  随机密码: 5Bh~{GfM@::nA5stMfaPl9
  UID: 139600004
  GID: 139600004
  密码: True
  组成员: ipausers
  Kerberos密码可用: True
# 尝试登陆然后更新密码
$ ssh gogs@ipa.corp.ansheng.me
Password: # 输入刚才生成的随机密码
Password expired. Change your password now.
Current Password:
New password: # 新密码为secure-password
Retype new password:
Creating home directory for gogs.

创建gogs_test_user用户

$ ipa user-add gogs_test_user --first=gogs --last=gogs --cn=GG --random
---------------------
已添加用户"gogs_test_user"
---------------------
  用户登录名: gogs_test_user
  名: gogs
  姓: gogs
  全名: GG
  显示名称: gogs gogs
  名字的首字母: gg
  主目录: /home/gogs_test_user
  GECOS: gogs gogs
  登录shell: /bin/sh
  主机名: gogs_test_user@CORP.ANSHENG.ME
  主体别名: gogs_test_user@CORP.ANSHENG.ME
  User password expiration: 20201120090127Z
  邮件地址: gogs_test_user@corp.ansheng.me
  随机密码: 2Rj?)7v2ICrH8G}P:-^!b?
  UID: 139600001
  GID: 139600001
  密码: True
  组成员: ipausers
  Kerberos密码可用: True

通过随机密码登录,然后重置密码

$ ssh gogs_test_user@ipa.corp.ansheng.me
Password:
Password expired. Change your password now.
Current Password:
New password:
Retype new password:
Creating home directory for gogs_test_user.

将gogs_test_user和admin用户加入staff组

$ ipa group-add-member staff --users={gogs_test_user,admin}
  组名: staff
  描述: Staff
  GID: 139600003
  成员用户: gogs_test_user, admin
---------
已添加的成员数 2
---------

下面的操作将在gogs服务器上执行

$ mkdir ~/deploy/git/data/gogs/conf/auth.d/
$ vi ~/deploy/git/data/gogs/conf/auth.d/ldap_bind_dn.conf
# This is an example of LDAP (BindDN) authentication
#
id           = 101
type         = ldap_bind_dn
name         = Staff
is_activated = true
is_default   = true

[config]
host               = ipa.corp.ansheng.me
port               = 636
# 0 - Unencrypted, 1 - LDAPS, 2 - StartTLS
security_protocol  = 1
skip_verify        = true
bind_dn            = uid=gogs,cn=users,cn=accounts,dc=corp,dc=ansheng,dc=me
bind_password      = secure-password
user_base          = cn=users,cn=accounts,dc=corp,dc=ansheng,dc=me
attribute_username = uid
attribute_name     = givenName
attribute_surname  = sn
attribute_mail     = mail
attributes_in_bind = true
filter             = (&(memberOf=cn=staff,cn=groups,cn=accounts,dc=corp,dc=ansheng,dc=me)(uid=%s))
admin_filter       = (memberOf=cn=admins,cn=groups,cn=accounts,dc=corp,dc=ansheng,dc=me)
group_enabled      = false
group_dn           =
group_filter       =
group_member_uid   =
user_uid           =

上面的参数请确保每个都填写正确,filter规则表示这个用户在staff组则允许登陆,admin规则表示这个用户要在admins组才会是gogs是管理员。

$ docker-compose restart

然后我们用root用户登陆Gogs,右上角管理面板->认证源管理就可以看到我们刚添加的配置文件了

Untitled

为了测试配置是否成功,我们退出root用户,然后重新登陆,在登陆界面中我们选择LDAP BindDN方式

Untitled

如果登陆成功,恭喜,配置成功,这里如果用gogs_test_user用户登陆则gogs会创建一个普通用户相对应,如果用admin用户登陆则会报500错误,admin被gogs占用了,所以不要用这个用户名,如果你要测试你需要创建一个用户并把这个用户添加到staff组和admin组才可以。

这里还有个坑要注意下,Gogs不会在每次登陆的时候同步用户信息,比如:当把sa用户添加到admins组,sa用户第一次登陆的时候是gogs的管理员,过段时间之后你在FreeIPA里面把sa用户从admins组里面剔掉了,你再用sa用户登陆gogs,依旧是gogs的管理员,你可以参考这个issuesLDAP user information doesn’t update

一个小小的功能,在FreeIPA Server上面获取用户gogs用户的DN,你能把这个看懂了,ldap_bind_dn.conf配置文件中的filter对你来说就不在话下了

$ ldapsearch -x -H ldaps://ipa.corp.ansheng.me -w "secure-password" -D "uid=gogs,cn=users,cn=accounts,dc=corp,dc=ansheng,dc=me" -b "uid=gogs,cn=users,cn=accounts,dc=corp,dc=ansheng,dc=me"

参考文献