惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Cloudflare Blog
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LangChain Blog
W
WeLiveSecurity
P
Proofpoint News Feed
月光博客
月光博客
NISL@THU
NISL@THU
L
LINUX DO - 最新话题
Webroot Blog
Webroot Blog
T
Threatpost
Y
Y Combinator Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Threat Research - Cisco Blogs
Vercel News
Vercel News
Jina AI
Jina AI
阮一峰的网络日志
阮一峰的网络日志
S
Schneier on Security
J
Java Code Geeks
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
小众软件
小众软件
MyScale Blog
MyScale Blog
N
News and Events Feed by Topic
Stack Overflow Blog
Stack Overflow Blog
有赞技术团队
有赞技术团队
The Hacker News
The Hacker News
Schneier on Security
Schneier on Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Help Net Security
Help Net Security
Recent Announcements
Recent Announcements
S
Security @ Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Securelist
T
The Exploit Database - CXSecurity.com
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
雷峰网
雷峰网
量子位
Google DeepMind News
Google DeepMind News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Spread Privacy
Spread Privacy
L
Lohrmann on Cybersecurity
I
Intezer
T
The Blog of Author Tim Ferriss
G
GRAHAM CLULEY
D
DataBreaches.Net
V
Vulnerabilities – Threatpost
P
Privacy & Cybersecurity Law Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
罗磊的独立博客

克洛洛日记

一年回本计划 | 克洛洛日记 股票期权的Theta | 克洛洛日记 股票期权的Gamma | 克洛洛日记 股票期权的Delta | 克洛洛日记 KDJ指标 | 克洛洛日记 布林线 | 克洛洛日记 MACD指标 | 克洛洛日记 RSI指标 | 克洛洛日记 时间协议 | 克洛洛日记 聊聊Spring的stereotype注解 | 克洛洛日记 免费申请 JetBrains 全产品 License | 克洛洛日记 Aloha 一个Hexo主题 | 克洛洛日记 泰国之旅 [三] | 克洛洛日记 泰国之旅 [二] | 克洛洛日记 泰国之旅 [一] | 克洛洛日记 Nginx使用SSL证书配置https | 克洛洛日记 i18next | 克洛洛日记 使用Github、Travis-CI和Coding.net自动部署博客[三] | 克洛洛日记 使用EditorConfig | 克洛洛日记 JavaScript执行window.print()打印内容为空白 | 克洛洛日记 使用Github、Travis-CI和Coding.net自动部署博客[二] | 克洛洛日记 寓食记 | 克洛洛日记 使用Github、Travis-CI和Coding.net自动部署博客[一] | 克洛洛日记 书单 | 克洛洛日记 WebJars使用示例 | 克洛洛日记 WebJars介绍 | 克洛洛日记 Maven打jar包内容出错 | 克洛洛日记 数据分布式模型 | 克洛洛日记 Wicket的HelloWorld | 克洛洛日记 Java运行时内存结构 | 克洛洛日记 前端优化法则 | 克洛洛日记
错误排查:非ROOT用户使用密钥进行ssh登录提示输入密码 | 克洛洛日记
海拉鲁球果 <hyrul · 2017-07-07 · via 克洛洛日记

· ssh / linux / git / gogs

由于个人的需要,需要搭建一个私有的git服务器,当然还需要有完善的操作界面,综合下来,我选择了Gogs

问:为什么不用GitHub呢?
答:我们不想让别人看到我们的代码。
问:GitHub有private的呀!
答:那要钱,我们没钱。。。

很顺序按照官网的步骤一步一步搭建完成了(其实早就用过了,这是第N次的搭建),然后另一个人上传了代码(注意这是通过http的方式的),于是我去下载。

我不喜欢用http的方式,因为要输入密码,而且也不安全,所以一直保持着使用ssh的方式。首先我配置了个人的公钥,但是执行git clone以后一直都提示我输入密码!

于是我就开始了一步一步排查!

客户端私钥配置

一般情况下,ssh 会拿 ~/.ssh/id_rsa 去连接,但是如果多个密钥对连接不同的域名的话,就需要在 ~/.ssh/config 里进行指定域名的配置:

host {{domain}}
user git
hostname {{domian}}
port 22
identityfile ~/.ssh/id_rsa_2

这里的 ~/.ssh/id_rsa_2 就是我配置在 Gogs 的公钥所对应的私钥,这样我进行 git clone git@domian:username/repo.git 的时候就会去拿 ~/.ssh/id_rsa_2 了。

文件权限问题

首先确认了一下,以下文件和文件夹都是属于 Gogs 的运行用户和用户组(git:git)的:

/home/git/.ssh
/home/git/.ssh/authorized_keys

我们使用 ssh 的方式 clone repository, 其实所使用的 ssh 用户 是 git,git用户相对于系统的root用户就是个非root用户了。

ssh对于非root用户的密钥限制是非常严格的,它不允许以上的文件夹和文件有太大的权限,.ssh只需要700,而authorized_keys只需要600。执行以下命令确认权限问题:

chmod 700 /home/git/.ssh
chmod 600 /home/git/.ssh/authorized_keys

可是,再运行 git clone 还是提示需要密码!

sshd_config配置问题

首先打开日志进行错误跟踪:

注意先把 /etc/ssh/sshd_configLogLevel 改成 DEBUG,不然看不到debug级别的日志。

tail -f /var/log/auth.log

然后在客户端执行 git clone 命令,看到了 /var/log/auth.log里:

Jul  7 22:57:24 localhost sshd[13061]: debug1: temporarily_use_uid: 1003/1003 (e=0/0)
Jul  7 22:57:24 localhost sshd[13061]: debug1: trying public key file /root/.ssh/authorized_keys
Jul  7 22:57:24 localhost sshd[13061]: debug1: Could not open authorized keys '/root/.ssh/authorized_keys': Permission denied
Jul  7 22:57:24 localhost sshd[13061]: debug1: restore_uid: 0/0
Jul  7 22:57:24 localhost sshd[13061]: Failed publickey for git from 180.158.160.234 port 50987 ssh2: RSA ......

上面的这一条引起了注意:

Jul  7 22:57:24 localhost sshd[13061]: debug1: Could not open authorized keys '/root/.ssh/authorized_keys': Permission denied

很奇怪ssh为什么去读root用户的authorized_keys,而不是git用户的。

于是打开 /etc/ssh/sshd_config,找到:

AuthorizedKeysFile      ~/.ssh/authorized_keys

这里错了,应该是 .ssh/authorized_keys!改完以后是:

AuthorizedKeysFile      .ssh/authorized_keys

如果是 ~/.ssh/authorized_keys ,那么ssh就去拿了 /root/.ssh/authorized_keys,而不是所请求的用户(git)的 ~/.ssh/authorized_keys 了,为什么呢?这是我自己的理解:首先ssh在获取到了请求用户的用户名后(使用git clone的话一般是git用户),然后ssh就会设置当前目录在git用户的home目录下,如果配置 .ssh/authorized_keys ,就能拿到 git 用户所需要的 authorized_keys 了,但是如果配置 ~/.ssh/authorized_keys,则去拿了ssh service的执行者root用户的home下面的 .ssh/authorized_keys 了。

总结

一般出现使用 ssh 的方式进行 git 远程操作(比如 git clone),出现需要密码的情况,或者配置了密钥进行 ssh 登录,但是还是需要密码的情况,可以先从以下三点进行错误排查:

  • 客户端私钥是否指定正确
  • 非root用户的文件权限是否有问题
  • sshd_config配置是否有问题