下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

深入了解Git : SSH 协议服务器

作者:课课家教育     来源: http://www.kokojia.com点击数:963发布时间: 2017-05-27 09:00:25

标签: 安全SSH服务器

  最基本的就是_本地协议(Localprotocol)_,所谓的远程仓库在该协议中的表示,就是硬盘上的另一个目录。这常见于团队每一个成员都对一个共享的文件系统(例如NFS)拥有访问权,或者比较少见的多人共用同一台电脑的情况。后面一种情况并不安全,因为所有代码仓库实例都储存在同一台电脑里,增加了灾难性数据损失的可能性。

ssh协议用于为Git提供远程读写操作,是远程写操作的标准服务。

  SSH协议语法格式

深入了解Git : SSH 协议服务器_安全_SSH_服务器_课课家教育

  对于拥有shell登录权限的用户账号,可以用下面的语法访问Git版本库:

  语法1:ssh://[<username>@]<server>[:<port>]/home/xxx/repo1.git

  语法2:[<username>@]<server>:/home/xxx/repo1.git

  注意:

  SSH协议地址格式可以使用两种不同的写法,第一种是使用ssh://开头的标准的SSH协议URL写法,第二种是SCP格式的写法。SSH协议标准的URL写法稍嫌复杂,但是对于非标准SSH端口(非22)可以直接在URL中给出端口号。

  <username>是服务器<server>上的用户账号,如果省略用户名,则会使用当前登录用户的用户名(配置和使用了主机别名的除外)。

  <port>为SSH协议端口,默认为22。当使用了非默认端口时,最好使用语法1。当然使用语法2也可以实现,但是要通过~/.ssh/config配置文件设置主机别名。

  路径/home/xxx/repo1.git是服务器中版本库的绝对路径。若用相对路径则是相对于username用户的家目录。

  如果采用口令认证,必须在每次连接时输入口令。

  如果采用公钥认证,则不用输入口令。

  服务器架设方式比较

  SSH协议有两种方式来实现Git服务。第一种是用标准的SSH账号访问版本库。即用户账号可以直接登录到服务器获得shell。对于这种使用标准SSH账号的方式,直接使用标准的SSH服务就可以了。

SSH协议有两种方式来实现Git服务。第一种是用标准的SSH账号访问版本库。即用户账号可以直接登录到服务器获得shell。对于这种使用标准SSH账号的方式,直接使用标准的SSH服务就可以了。

  第二种实现方式是所有用户都使用同一个专用的SSH账号访问版本库,访问时通过公钥认证的方式。虽然所有用户用同一个账号访问,但可以通过在建立连接时所用的不同公钥来区分不同的用户身份。Gitolite就是实现该方式的服务器软件。

  HTTP/S协议

  优点

  使用HTTP协议的好处是易于架设。几条必要的命令就可以让全世界读取到仓库的内容。花费不过几分钟。HTTP协议不会占用过多服务器资源。因为它一般只用到静态的HTTP服务提供所有数据,普通的Apache服务器平均每秒能支撑数千个文件的并发访问—哪怕让一个小型服务器超载都很难。

  你也可以通过HTTPS提供只读的仓库,这意味着你可以加密传输内容;你甚至可以要求客户端使用特定签名的SSL证书。一般情况下,如果到了这一步,使用SSH公共密钥可能是更简单的方案;不过也存在一些特殊情况,这时通过HTTPS使用带签名的SSL证书或者其他基于HTTP的只读连接授权方式是更好的解决方案。

  HTTP还有个额外的好处:HTTP是一个如此常见的协议,以至于企业级防火墙通常都允许其端口的通信

  缺点

  HTTP协议的消极面在于,相对来说客户端效率更低。克隆或者下载仓库内容可能会花费更多时间,而且HTTP传输的体积和网络开销比其他任何一个协议都大。因为它没有按需供应的能力—传输过程中没有服务端的动态计算—因而HTTP协议经常会被称为_傻瓜(dumb)_协议。

  标准SSH账号和专用SSH账号这两种实现方式的区别:

  实际上,标准SSH也可以用公钥认证的方式实现使用用户公用同一个账号,不过这类似于把一个公共账号的登录口令同时告诉给多个人。具体操作如下:

  1.在服务器端创建一个公共账号,例如sparker。

  2.管理员收集需要访问git服务的用户公钥。如user1.pub,user2.pub。

  3.使用ssh-copy-id命令将各个git用户的公钥远程加入服务器的公钥认证列表中。

  3.1.远程操作,可以使用ssh-copy-id命令。

  $ssh-copy-id-iuser1.pubsparker@server

  $ssh-copy-id-iuser2.pubsparker@server

  3.2.如果直接在服务器上操作,则直接将文件追加到authorized_keys文件中。

  $catuser1.pub>>~sparker/.ssh/authorized_keys

  $catuser2.pub>>~sparker/.ssh/authorized_keys

  4.在服务器端的sparker用户主目录下建立git库,就可以实现多个用户利用同一个系统账号(sparker)访问git服务了。

  这样做除了不必逐一设置账号,以及用户无须口令认证之外,标准SSH部署git服务的缺点一个也不少,而且因为无法区分用户,也就无法针对用户进行授权。

  SSH公钥认证

这样做除了不必逐一设置账号,以及用户无须口令认证之外,标准SSH部署git服务的缺点一个也不少,而且因为无法区分用户,也就无法针对用户进行授权。

  为实现公钥认证,作为认证的客户端一方需要拥有两个文件,即公钥/私钥对。一般情况下,公钥/私钥对文件创建在用户家目录下的.ssh目录中。如果用户家目录中不存在.ssh目录,说明SSH公钥/私钥对尚未创建。可以用下面的命令创建:

  $ssh-keygen

  该命令会在用户家目录下创建.ssh目录,并在其中创建两个文件:

  1.id_rsa

  私钥文件,它是基于RSA算法创建的,一定要妥善保管不要泄露。

  2.id_rsa.pub

  公钥文件,和id_rsa文件是一对儿,该文件作为公钥文件可以公开。

  创建了自己的公钥/私钥对以后,就可以使用下面的命令,实现无口令登录远程服务器(即用公钥认证取代口令认证)。

  $ssh-copy-id-i.ssh/id_rsa.pub<user>@<server>

  注意:

  该命令会提示用户输入user在server上的SSH登录口令。

  此命令执行成功后,再以user用户用ssh命令登录server远程主机时,不必输入口令即可直接登录。

  该命令实际上是将.ssh/id_rsa.pub公钥文件追加到远程主机server的user家目录下的.ssh/authorized_keys文件中。

  检查公钥认证是否生效,通过ssh命令连接远程主机,正常的话应该直接登录成功。如果要求输入口令则表明公钥认证配置存在问题。如果SSH登录存在问题,可以通过查看服务器端的/var/log/auth.log文件进行诊断。

  SSH主机别名

  在实际使用中,有时需要使用多套公钥/私钥对,例如:

  1.使用默认的公钥访问服务器的git账号,可以执行git命令,但不能进行shell登录。

  2.使用特别创建的公钥访问服务器的git账号,能够获取shell,登录后可以对Git服务器软件进行升级、维护等操作。

  3.访问Github使用其他公钥(非默认公钥)。

  从上面的说明可以看出,用户可能拥有不止一套公钥/私钥对。为了创建不同的公钥/私钥对,在使用ssh-keygen命令时就需要通过-f参数指定不同的私钥名称。具体用法如下:

  $ssh-keygen-f~/.ssh/<filename>

  请将<filename>替换为有意义的名称。命令执行完毕后,会在~/.ssh目录下创建指定的公钥/私钥对:文件<filename>是私钥,文件<filename>.pub是公钥。

  将新生成的公钥添加到远程主机登录用户家目录下的.ssh/authorized_keys文件中,就可以使用新创建的公钥建立到远程主机<server>的<user>账户的无口令登录。操作如下:

  $ssh-copy-id-i.ssh/<filename>.pub<user>@<server>

  现在用户存在多个公钥/私钥对,那么当执行下面的ssh登录命令时,用到的是哪个公钥呢?

  $ssh<user>@<server>

  当然是默认公钥~/.ssh/id_rsa.pub。那么如何用新建的公钥连接server呢?

  SSH的客户端配置文件~/.ssh/config可以通过创建主机别名,在连接主机时选择使用特定的公钥。例如~/.ssh/config文件中的下列配置:

  hostabc

  usergit

  hostnameabc.xxx.com

  port22

  Identityfile~/.ssh/abc

  注意,hostname也可以写成IP。

  然后执行下面的SSH登录命令:

  $sshabc

  或者执行git命令:

  $gitcloneabc:/home/abc/repo1.git

  虽然这两条命令各不相同,但是都使用了SSH协议,以及相同的主机别名:abc。参考上面在~/.ssh/config文件中建立的主机别名,可以做出如下判断:

  1.登录的SSH主机名为abc.xxx.com。

  2.登录时使用的用户名为git。

  3.认证时使用的公钥文件为~/.ssh/abc.pub。

  我们讨论并介绍了一些建立远程Git仓库的方法,接下来你可以通过这些仓库同他人分享或合作。

  运行自己的服务器意味着更多的控制权以及在防火墙内部操作的可能性,当然这样的服务器通常需要投入一定的时间精力来架设维护。如果直接托管,虽然能免去这部分工作,但有时出于安全或版权的考虑,有些公司禁止将商业代码托管到第三方服务商。

更多详细内容尽在课课家哦!

赞(16)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程