V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
jry
V2EX  ›  git

github、gitlab 等服务是如何储存用户的公钥的,为每个用户都在服务器创建一个本地用户,把公钥写进.ssh 里?

  •  
  •   jry · 2020-03-04 17:06:26 +08:00 · 4502 次点击
    这是一个创建于 1725 天前的主题,其中的信息可能已经有所发展或是发生改变。
    27 条回复    2020-03-05 21:08:50 +08:00
    shoaly
        1
    shoaly  
       2020-03-04 18:00:30 +08:00
    存数据库不好么, 一定要存成文件
    yuanfnadi
        2
    yuanfnadi  
       2020-03-04 18:10:23 +08:00   ❤️ 3
    https://api.github.com/users/:username/keys

    这个接口可以获取每个用户的 public key.
    liuguang
        3
    liuguang  
       2020-03-04 18:45:23 +08:00
    估计是实现 ssh 协议就行,不一定要搞真实 Linux 用户
    jry
        4
    jry  
    OP
       2020-03-04 18:45:45 +08:00
    @shoaly 问题就是数据库怎么搞,ssh 协议怎么支持从数据库里获取用户。
    AngryPanda
        5
    AngryPanda  
       2020-03-04 18:51:41 +08:00
    @jry 你以为他们没有自研能力吗
    ysc3839
        6
    ysc3839  
       2020-03-04 19:03:26 +08:00 via Android   ❤️ 2
    你会提这问题大概是觉得它们没有自己编写任何代码,全都是使用现成的 SSH 服务器,这样的话要实现多用户功能确实挺麻烦的。
    但是实际上他们会修改甚至自己实现 SSH 服务器,自然可以对接数据库。
    likexian
        7
    likexian  
       2020-03-04 19:29:59 +08:00   ❤️ 3
    不搞开发也可以,你也可以。

    OpenSSH 搜索 AuthorizedKeysCommand
    lc1450
        8
    lc1450  
       2020-03-04 19:30:06 +08:00
    刚看了下自己搭建的 gitlab 它使用的是 git 用户 公钥放在.ssh/authorized_keys

    其实从公钥验证就能猜出来 ssh -T [email protected]

    每条前面有 command="/xxxx/bin/gitlab-shell" 参数, 这个应该是把处理权交给 gitlab-shell

    这是用了和 sshd 同端口的方案, 如果专门给 git 服务开个端口, 那就直接由该 git 服务处理, 公钥想放哪就放哪儿
    ipwx
        9
    ipwx  
       2020-03-04 19:34:01 +08:00   ❤️ 2
    首先,pam 支持 mysql 和 postgres 这种数据库。甚至可以自己写 pam 插件。

    https://packages.ubuntu.com/source/xenial/pam-mysql
    https://packages.ubuntu.com/source/xenial/pam-pgsql

    其次,我觉得他们不需要用标准 SSH,自己写一个不就行了?
    wuqingdzx
        10
    wuqingdzx  
       2020-03-04 21:12:44 +08:00 via iPhone   ❤️ 2
    怎么感觉这帖子里回帖的有些人阴阳怪气的,知道就回答人家,不知道就闭嘴呗,冷嘲热讽的。v2 什么时候风气变这样了
    j0hnj
        11
    j0hnj  
       2020-03-04 21:18:12 +08:00 via iPhone
    @wuqingdzx #10 恕我直言,我没有发现楼上有冷嘲热讽的啊?是不是你太敏感了?
    lululau
        12
    lululau  
       2020-03-04 21:40:17 +08:00
    gitlab 开源的。。。看代码不就知道了。。。
    forcecharlie
        13
    forcecharlie  
       2020-03-04 23:37:49 +08:00 via iPhone
    数据库 keys 表 我们平台 git ssh 服务&鉴权全是我写的
    forcecharlie
        14
    forcecharlie  
       2020-03-04 23:47:49 +08:00 via iPhone   ❤️ 3
    数据库 keys 表 ,可以使用 golang 或者 libssh 编写 ssh 服务。这要比 openssh authorized_keys ( gitlab 这点做得不行)方案好一些。

    具体就是在 ssh 请求 publickey 交互的时候获得用户的 publickey 计算指纹去数据库查。(通常会走 API )

    PS:我们平台 git ssh 服务&鉴权全是我写的
    https://forcemz.net/git/2019/10/01/ExploreSomeIssuesWithGitHost/
    ShareDuck
        15
    ShareDuck  
       2020-03-05 02:08:04 +08:00 via Android
    @wuqingdzx 不不不,这才是 V2 的风气。
    reus
        16
    reus  
       2020-03-05 08:20:33 +08:00 via Android
    @wuqingdzx 那你怎么不闭嘴,你怎么又在热讽?对人对己,标准一致不好吗?
    alphatoad
        17
    alphatoad  
       2020-03-05 08:56:37 +08:00
    Libssh/libssh2,很好用
    这个规模的公司,还有全球 scale 的需求,不会用现成的实现的
    julyclyde
        18
    julyclyde  
       2020-03-05 10:39:20 +08:00
    gitlab 是:
    所有 git 用户共用同一个 ssh 用户
    authorized_keys 里,每一行 key 都指定 command,在 command 参数里写上 git 用户的名字
    julyclyde
        19
    julyclyde  
       2020-03-05 10:40:54 +08:00
    其实上面大部分回答,并不觉得阴阳怪气啊
    只是回答的并不是 gitlab 实际的情况而已;脱离 gitlab 这个语境的话,都可以算是可行的做法
    imkerberos
        20
    imkerberos  
       2020-03-05 10:43:33 +08:00
    PAM 插件即可,不一定需要真实用户。
    ivyliner
        21
    ivyliner  
       2020-03-05 13:09:37 +08:00
    @jry gitlab 是把 key 放到数据库的 keys 这个 table 里面
    具体的原理可以看一下 https://github.com/gitlabhq/gitlab-shell


    select * from keys where title limit 1;
    -[ RECORD 1 ]------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    id | 2
    user_id | 3
    created_at | 2016-12-26 07:29:47.71315
    updated_at | 2018-03-27 06:38:27.813502
    key | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHKN5NtDozWty5/KTa9sVyNWR4LtufJI/nfg2pkZr4qg7KCmoaBQYW/qZXA2aX54SHGpOfcC/hJuGXFOor/HLC2K6uy656k8pb3ps/fYxOhd9yBxfBFvktDnZ/HNpCw9+OBV5WYgpS6oaXLIGNmMP28uMrlx9XdWYjoJEkAUlg7jT+I53kXRSF7KKP2xBXpWTm0tyzI50GBHOg4TMps8fvraG/2Bl6J4R7ZLDmN3bQQ5S1Q/OUGBd+K385bsvwvF/7o3QPZYzrEF0EVjN41b6MUxGT47wAAtgo1HhVBaFDDzad3z4NGhWD+L5wUEhxYSLxqcLFiEvs2hvPc8
    title | ym
    type |
    fingerprint | 08:66:93:e4:31:20:ac:d3:c6:65:af:a8:b8:6e:7c:13
    public | f
    last_used_at | 2020-03-05 02:35:54.852897
    fingerprint_sha256 | \x99af1b54849fe9ced262132b1bbad15b4917d67ba3fc03f13e1a4f679a74c74c
    julyclyde
        22
    julyclyde  
       2020-03-05 18:20:40 +08:00
    @ivyliner 那个 table 只是 gitlab 用来“产生 authorized_keys”的数据源吧
    jry
        23
    jry  
    OP
       2020-03-05 18:47:52 +08:00
    感谢大家的回复:
    jry
        24
    jry  
    OP
       2020-03-05 18:48:20 +08:00
    居然回车就发布了咋换行
    ivyliner
        25
    ivyliner  
       2020-03-05 18:57:30 +08:00 via Android
    @julyclyde 是的,我们两个人答案和合起来就完整了
    jry
        26
    jry  
    OP
       2020-03-05 19:03:48 +08:00
    @forcecharlie 很有帮助,写的好详细,🐂🍺
    otakustay
        27
    otakustay  
       2020-03-05 21:08:50 +08:00   ❤️ 1
    我也觉得这个楼里有部分用户的回复语气过于诡异,非常不建议在公开社区,特别是相对严肃的技术讨论场合下,使用“你以为 XXX 吗”这种反问句,都是工程师,有一说有正面上就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1910 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:38 · PVG 08:38 · LAX 16:38 · JFK 19:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.