5.3 产生你的SSH公钥(Generating Your SSH Public Key)
正如刚才提到的,许多Git服务器认证采用SSH公钥。为了提供一个公钥,你系统中的每个用户必需产生一个如果他们还没有的话。这个过程在各个操作系统中是基本类似的。首先,你应该检查并确认你还没有这个公钥。缺省情况下,一个用户的SSH密钥存储在这个用户的~/.ssh目录中。你可以简单地到这个目录中并列出目录内容来看一下你是否已经有密钥了:
$ cd ~/.ssh
$ ls
authorized_keys2 id_dsa known_hosts
config id_dsa.pub
你正在寻找一对文件命名为xxx以及xxx.pub;这里,xxx通常是id_dsa或者id_rsa。.pub文件是你的公钥,另一个文件是你的私钥。如果你没有这些文件(或者你还没有.ssh目录),你可以通过运行ssh-keygen来创建它们。这个命令在Linux/Mac系统上随着SSH包一起提供,在Windows上,则随MsysGit包提供:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/schacon/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/schacon/.ssh/id_rsa.
Your public key has been saved in /Users/schacon/.ssh/id_rsa.pub.
The key fingerprint is:
43:c5:5b:5f:b1:f1:50:43:ad:20:a6:92:6a:1f:9a:3a schacon@agadorlaptop.local
首先,它确认你想在哪儿存储密钥(.ssh/id_rsa),然后它会为passphrase询问你两次,如果你不想在使用密钥时输入密码你可以留置他们为空。
现在,每个这么做的用户都把他们的公钥发送给你或者管理Git服务器的其它那个人(架设你正在使用那个需要公钥的SSH服务器)。他们所需要做的是copy .pub文件的内容并通过e-mail发送它。公钥看起来如下:
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== schacon@agadorlaptop.local
寻求更深入的在不同操作系统上创建SSH密钥的教程,请查看GitHub关于SSH密钥的指导,这个指导位于http://github.com/guides/providing-your-ssh-key.
5.4 设置服务器(Setting Up the Server)
让我们来看一下在服务器端设置SSH访问权限。在本例中,你将使用authorized_keys方法来对你的用户进行认证。我们也假定你正在运行一个标准的Linux分发如Ubuntu。首先,你创建一个git用户并为其创建一个.ssh目录:
$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh
下一步,你需要为开发者们增加他们的SSH公钥到authorized_keys文件中。假定你已经通过e-mail收到了几个密钥文件并把它们存储到了临时文件中。重复一遍,公钥看起来如下:
$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair
你只需要把它们增加到你的authorized_keys文件中:
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys
现在,你可以为他们设置一个空库。这可以通过运行带参数--bare选项的git init命令来实现,它将初始化一个没有工作目录的库:
$ cd /opt/git
$ mkdir project.git
$ cd project.git
$ git --bare init
然后,John,Josie或者Jessica就可以通过增加它为远端并上传一个分支的方法来上传他们的项目的第一个版本到库中了。注意,每次当你需要增加一个项目时,必需有人登录到这台机器的shell上创建一个裸库。让我们使用gitserver来命名你创建git用户和库的那台主机。如果你在内部运行它,而且设置了DNS,用gitservver来指向那台服务器,那么,你可以使用如下类似命令:
# on Johns computer
$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/opt/git/project.git
$ git push origin master
此时,其它人就可以把它clone下来并简单地上传回他们的更改:
$ git clone git@gitserver:/opt/git/project.git
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master
使用这个方法,你可以快速地使一个可读写的Git Server建立起来并服务于几个开发者。
作为一个附加的预防措施,你可以简单地限制git用户仅只做Git操作相关的事情,它可以使用一个随Git而来的被称为git-shell的shell工具来达到这个目的。如果你设置这个工具作为你的git用户的登录shell,那么git用户不能有正常的shell访问。为使用它,指定git-shell来代替bash或者csh来作为你的用户的登录shell。为做到这一点,你可能需要编辑/etc/passwd文件:
$ sudo vim /etc/passwd
在文件末尾,你会发现一行看起来如下:
git:x:1000:1000::/home/git:/bin/sh
改变/bin/sh为/usr/bin/git-shell(或者运行一下which git-shell来看一下它安装在哪里)。这一行应该看起来如下:
git:x:1000:1000::/home/git:/usr/bin/git-shell
现在,git用户仅只可以使用SSH连接来push和pull Git库而不能shell到机器上。如果你试图登录,你会看到一个登录拒绝消息如下:
$ ssh git@gitserver
fatal: What do you think I am? A shell?
Connection to gitserver closed.