这篇文章上次修改于 743 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

起因

利用docker在一台centos服务器上安装完gitlab后,发现git拉取和提交只能使用http方式,使用ssh方式一直提示要输入密码,检查ssh的key已经配置好,在gitlab创建的git用户下也存在提交上去的key,目录权限等都没有问题,上网查了很久,都没找到对应问题发生的原因

原理

Linux /etc/shadow 内容解析

/etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。

注意,如果这个文件的权限发生了改变,则需要注意是否是恶意攻击。

介绍此文件之前,我们先打开看看,执行如下命令:

[root@centos .ssh]# cat /etc/shadow
root:$6$X7lUZpQc$mZs...YD4jVtR3kPq.JuX6Db0:19088:0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::

同 /etc/passwd 文件一样,文件中每行代表一个用户,同样使用 “:” 作为分隔符,不同之处在于,每行用户信息被划分为 9
个字段。每个字段的含义如下:

用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

用户名

同 /etc/passwd 文件的用户名有相同的含义。

加密密码

这里保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512
散列加密算法的加密等级更高,也更加安全。

注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 “!”、”*” 或 “x” 使密码暂时失效。

所有伪用户的密码都是 “!!” 或 “*”,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是
“!!”,代表这个用户没有密码,不能登录。

解决

gitlab用到的git账号,如果机器上之前没有,则会新增git用户,此时该git用户因为密码为!!,代表无法登录,需要初始化一次git密码,才能进行使用