一个 Gitlab 帐号无法访问文件、克隆项目问题的解决

一天晚上,同事突然在企业微信上告诉我,他的 gitlab 帐号访问出了问题:
在这里插入图片描述

而在此之前,他就已经发现自己的帐号没有办法通过 https 协议来克隆项目了

在这里插入图片描述

他的帐号本身是有 Admin 权限的,居然连这个操作都没法做到?我们一起对这个问题进行了排查。

确认不是 Gitlab 设置问题

首先确认了一下是不是 Gitlab 设置的问题。Gitlab 对用户鉴权的配置:

在这里插入图片描述

在勾选和不勾选这个选项的情况下,我个人的帐号都能顺利的克隆项目,所以排除了它的原因。

确认不是 Cookie、会话、缓存的问题

同事清理了浏览器 cookie,检查了 hosts 文件,甚至重启了机器,问题依然存在。

而同时我的帐号和其他同事的帐号没有问题。我让他改了个密码让我用他的帐号尝试,果然是一样的问题。

所以锁定了是同事的个人帐号出了问题。

锁定用户密码问题

同事提到因为有一个项目需要 git lfs push,只能使用 https,他当时登不上,也尝试用 Gitlab 管理员界面给自己的 LDAP 用户修改了密码,依然登录不了,然后登录 web 界面就发现了文章第一个图片里的错误。

在沟通的过程中我们忽略了一个关键信息:

在这里插入图片描述

他在尝试拉取一个已有的仓库时报了密码过期错误。因为从 web 界面登录时密码没有问题,所以这个问题当时我们没有太多关注。

我们更多的是以为他的帐号权限配置出了问题,因为上面截图里提醒了这一点。然而从 Gitlab web 界面和数据库记录里对帐号权限进行了多番查看,都没有发现任何问题。

我查看了 Gitlab 日志 gitlab/logs/gitlab-rails/production.log ,找到了我用同事帐号访问时的一个 403 Forbidden 报错:

在这里插入图片描述

我用他的帐号配置了一个 access token,跑了一个 API 请求:

curl --request POST --header "PRIVATE-TOKEN: MSXXXXXXXXXXXXXash" "https://gitlab.example.com/api/v4/projects/178/access_requests"
{
   "message":"403 Forbidden - Your password expired. Please access GitLab from a web browser to update your password."}

终于明白了这个 403 错误就是密码过期造成的。

然而我们的 Gitlab 帐号是通过 Active Directory 提供的 LDAP 服务来登录的,从 AD 上查看同事的帐号是没有任何问题的,密码也没有过期:

在这里插入图片描述

那么很有可能就是同事在使用管理员界面修改密码的时候,密码过期了!

查了一下 Gitlab 的源代码 https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/admin/users_controller.rb ,确实有下面一个逻辑:

在这里插入图片描述

在数据库中查询同事的账号,他的密码果然已经过期了(这大半夜的……):

在这里插入图片描述

修改用户密码过期

后面的操作就简单了,登录 Gitlab 服务器,进入 Gitlab 容器(我们使用 docker 部署的 Gitlab):

docker exec -it gitlab bash

执行一个 Rails Console 操作:

在这里插入图片描述

也可以直接访问 Gitlab 的 PostgreSQL 数据库来操作。

到此,问题终于得到了彻底解决~!

总结

Gitlab 支持 LDAP 是很方便,但如果给 LDAP 用户通过管理员帐号改了密码,就可能出现我同事的帐号发生的问题。

出现问题了不要慌,把所有可能性排除掉,一定能找到问题根源。

附:访问 Gitlab PostgreSQL 数据库

# 进入 gitlab 容器
$ docker exec -it gitlab bash

# 转变为 postgresql 用户 gitlab-psql,这个用户名可以从 gitlab 配置文件 gitlab/config/gitlab.rb 里取得
root@gitlab:/# su - gitlab-psql

# 容器里的 postgresql 的 socket 在 gitlab-psql 用户 home 下的 .s.PGSQL.5432,故使用 -h ~ 即可连接
# 需要指定数据库,数据库名称可以从 gitlab 配置文件 gitlab/config/gitlab.rb 里取得
gitlab-psql@gitlab:~$ psql -h ~ -d gitlabhq_production
psql (12.6)
Type "help" for help.

# 列出数据库
gitlabhq_production=# \l
                                        List of databases
        Name         |    Owner    | Encoding | Collate | Ctype |        Access privileges
---------------------+-------------+----------+---------+-------+---------------------------------
 gitlabhq_production | gitlab      | UTF8     | C       | C     |
 postgres            | gitlab-psql | UTF8     | C       | C     |
 template0           | gitlab-psql | UTF8     | C       | C     | =c/"gitlab-psql"               +
                     |             |          |         |       | "gitlab-psql"=CTc/"gitlab-psql"
 template1           | gitlab-psql | UTF8     | C       | C     | "gitlab-psql"=CTc/"gitlab-psql"+
                     |             |          |         |       | =c/"gitlab-psql"
(4 rows)

# 连接数据库 gitlabhq_production
gitlabhq_production=# \c gitlabhq_production
You are now connected to database "gitlabhq_production" as user "gitlab-psql".

# 列出库中的表、序列等等
gitlabhq_production=# \d
                                      List of relations
 Schema |                          Name                          |       Type        | Owner
--------+--------------------------------------------------------+-------------------+--------
 public | abuse_reports                                          | table             | gitlab
 .
 . #此处省略一万行……
 .
 public | user_synced_attributes_metadata                        | table             | gitlab
 public | user_synced_attributes_metadata_id_seq                 | sequence          | gitlab
 public | users                                                  | table             | gitlab
 public | users_id_seq                                           | sequence          | gitlab
 .
 . #此处省略一万行……
 .
 public | zoom_meetings_id_seq                                   | sequence          | gitlab
(939 rows)

# 描述数据表 user
gitlabhq_production=# \d users
                                                         Table "public.users"
                    Column                    |            Type             | Collation | Nullable |              Default
----------------------------------------------+-----------------------------+-----------+----------+-----------------------------------
 id                                           | integer                     |           | not null | nextval('users_id_seq'::regclass)
 email                                        | character varying           |           | not null | ''::character varying
 encrypted_password                           | character varying           |           | not
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值