安装操作系统
这次使用的是 CentOS 7.0.1406,安装的 ISO 档可至官网下载。一般只要用到 DVD 就足够了,所以下载的是 CentOS-7.0-1406-x86_64-DVD.iso。如果频宽有限可以考虑下载 CentOS-7.0-1406-x86_64-Minimal.iso,这是最精简的版本,只安装操作系统运作的必要元件。不过也由于是最精简的版本,所以安装完了之后如果有需要加装额外的服务,需要再自行另外下载。
为了分散流量,所以下载时大多经由较近的载点来取得文件,但不同的载点其实是有文件被恶意窜改的可能,要确保所下载的文件是与官网所发布的一致,可以检查文件的验证码。验证 ISO 档的方法,各操作系统都会有一些差异。像在 OS X 里是使用以下的指令:
shasum -a 256 CentOS-7.0-1406-x86_64-DVD.iso
如果是 DVD 的版本,在执行后出现的结果是:
ee505335bcd4943ffc7e6e6e55e5aaa8da09710b6ceecda82a5619342f1d24d9
代表所下载到的文件内容与官网一致,没有被修改过。验证码可以至官网的 Release Notes 中查询。
使用安装档开机之后,第一个画面如下:
选择【Install CentOS 7】,会进入以下的欢迎画面:
由于不是做为桌面操作的环境,所以这里使用默认的英文语系。接下来进入到以下的 Installation Summary 画面:
首先要进入【DATE & TIME】进行时区的设定,不然之后文件存档的时间可能会不太正常,设好时区按下画面左上方的【Done】按钮回到 Installation Summary 画面。
接下来进入【SOFTWARE SELECTION】选择在安装过程中要一并被安装的套件。如果使用的是精简版本来开机进入安装程序,在这个画面中其实是没有套件可以选择的。目前是以 DVD 版本来进行安装,所以可以看到许多预先配置好的套件组合。如果是选择 Minimal Install -> Development Tools 组合,其中就会包含了 Git Server。但由于这次只是单纯的想要架设 Git Server,为了避免不必要的套件造成资安漏洞上的风险,所以只选择了 Compatibility Libraries。
如果在安装完了之后想要再安装 Development Tools 的套件组合,可以使用以下的指令来完成:
yum -y groupinstall "Development Tools"
选好了套件后,按下画面左上方的【Done】回到 Installation Summary 画面,再来设定【INSTALLATION DESTINATION】。
安装程式会预先规划好磁碟空间的配置,如果没有特别的需求可以不用更动。这次安装规划了二个磁碟,一个是用来做为系统运作之用,另一个则为存放 Git Repository 之用。所以要调整 Data 加挂的位置,大部份网络上的示范都是挂在 /opt/git 下,也有一派的说法是挂在 /var/git 下。参考了维基百科的说明之后,我的理解是放在 /srv/git 下比较符合目录结构的定义,毕竟 Repository 也只放置版本控管用的资料。再者,挂在跟大家都不一样的地方也有个好处是,被入侵时也比较不容易直接被猜到文件的位置。
之所以规划二个磁碟,主要是考量到让系统和资料不会因为磁碟损毁而同生共死。另外一个考量是未来如果操作系统升级或更换,可以不用特别把文件复制出来,只要再将磁碟机挂回去就行了。这次示范时是使用 Virtual Box 来模拟,Data 所属的那个磁碟机文件可以先设为 Writethrough。所以在操作的过程中如果怕失误要做 Snapshot,这个磁碟机不会被列在 Snapshot 里,也就是一直维持最新的状态。换句话说,不管用哪一个 Snapshot 还原回来,Data 依然是保持最后更新的内容。
把 Data 设为 Writethrough 的好处是可以避免让磁碟机文件占用的空间爆增,因为 Data 本身就是用来保留不同版本的文件内容,如果再经过 Snapshot 所占用的空间可能会呈倍数成长。另外还可以避免因操作错误,要进行还原时,资料一并被还原导致要重新输入的困扰。最后由于 Data 不会跟着 Snanpshot 的资料,所以同样的资料可以被任意的重新挂在不同的虚拟机上做操作与研究。当然,由于 Data 不会被 Snapshot 所以一旦有资料误输入是无法透过 Snapshot 来还原,这是要特别注意的。
设定的方法是在 Virtual Box 的主画面中执行 Virtual Media Manager,选择要变更 Mode 的磁碟机文件,按下【Modify】按钮。接着会看到 Normal、Immutable、Writethrough、Shareable、Multi-attach 等不同 Mode 的选项,点选 Writethrough 后按下【OK】按钮即可。
再回到安装的程序,设定好磁碟规划后,一样是按下画面左上方【Done】的按钮,回到 Installation Summary 画面。最后设定【NETWORK & HOSTNAME】,画面如下:
示范画面中显示的二张网卡一张是用来连结 Internet,另外一张则是用来连接 Intranet。
安装时默认是不会在开机后自动将网卡连上网络,所以要记得到在选定网卡后按下【Configure...】的按钮,并把 “Automatically connect to this network when it is available” 的选项勾起来。如果在安装时忘了勾选以上的选项,还可以在安装完成后修改 /etc/sysconfig/network-scripts/ifcfg-*
文件,* 号是把上方画面中 Connection name 栏位的内容取代。在文件中将 ONBOOT
更改为 yes
或是新增一行 ONBOOT=yes
,修改后的文件内容示范如下:
修改完成后执行以下指令,以便使修改的内容生效:
service network restart
如果网络设定在安装完成之后出现问题,可以使用 ifconfig 的指令来检视相关的资讯。但是在 Minimal Install 之下并没有安装这个工具,可以使用以下的指令来进行安装:
yum -y install net-tools
如果不确定指令有没有被安装在系统中,可以先用以下二个指令其中一个来确认:
which ifconfig
whereis ifconfig
以下的指令则可以知道要安装哪一个套件:
yum provides ifconfig
最后记得输入在 DNS 注册好的主机网域名称,按下画面左上方【Done】的按钮,回到 Installation Summary 画面。按下【Begin installation】按钮之后会进入以下的 Configuration 画面:
画面中可以设定 Root 的密码及新增使用者帐号,在设定的同时安装的程序也会持续地进行。Root Password 的设定画面中会显示密码的强度,如果是对外的服务器最好还是符合安装程式的 Strong 建议,如以下示范的画面。
设定好密码之后,按下画面左上方【Done】的按钮,接下来进入【USER CREATION】的画面:
因为是要做为 Git 的服务器,所以在安装过程中就把帐号先设好,做为存取 Repository 的共用帐号,帐号名称使用网络上的习惯用法 git。Server 架设好了之后要使用 SSH 及金钥连线,所以把 “Require a password to use this account” 的勾选取消。按下最后一次画面左上方【Done】的按钮,回到 Configuration 画面,等安装程序完成后,会出现以下的画面。
按下【Reboot】按钮后,等候重开机完成,就可以出现以下的登入画面:
安装 SSH
执行以下指令,安装并启动 SSH 的服务:
yum -y install openssh*
service sshd start
systemctl enable sshd.service
systemctl status sshd.service
systemctl enable
是用来让 Service 在 boot 之后自动执行,systemctl status
可以检查 Service 的状态。SSH 安装完成并启动后可以用 Client 尝试连线来进行验证,第一次进行连线时会出现以下讯息:
client:~ $ ssh root@remotehost
The authenticity of host ‘remotehost (192.168.1.1)' can't be established.
RSA key fingerprint is 13:e4:9d:d4:12:85:88:b6:a3:5c:1a:fd:bf:46:9b:40.
Are you sure you want to continue connecting (yes/no)?
输入 yes 之后就可以使用密码进行连线,并且会显示以下方讯息,代表要连线的服务器已经被加到清单之中,下次再连线就不会出现警告的讯息。
Warning: Permanently added 'remotehost' (RSA) to the list of known hosts.
root@remotehost's password:
输入安装时设定的 root 密码,密码如果正确就可以完成连线。确定 SSH 运作正常后,就可以开始着手设定金钥。首先要切断刚才的 SSH 连线,回到 Client 端。在 Client 端中使用指令产生金钥,每个操作系统的指令都有些差异,以下是 OS X 的指令范例:
ssh-keygen -t rsa
在产生的过程中会要求要输入 passphrase,可以按下 enter 来跳过。很多的教学文章都是示范跳过 passphrase 的设定,如果只是试验或练习那还无所谓,但如果是要透过 Internet 来进行 SSH 连线,以资安的角度并不建议跳过。SSH 金钥使用的原理就像网银的证书一样,网银的证书在读取时也会被要求输入被设定的密码。这个密码就是用来保护证书档里的私钥,作用相当于这里的 passphrase。
金钥文件并不等于是私钥,金钥文件是一个装载公钥或私钥的容器。PKI 的设计重点是使用所谓的非对称式加密来进行资讯的传递,传递前用一组配对的公钥来进行加密,到达接收端时才用成对的私钥来解密,而讯息也只有使用和公钥配对的私钥才解得开。所以私钥在 PKI 的机制里是很关键的一环,私钥是必须要被保护的,否则就失去了 PKI 机制的用处。私钥曝露了就相当于是大门的钥匙被复制并且落在外人手上,这时就算有再坚固的大门、再复杂的门锁都没有用。
passphrase 和传统的帐密登入的 password 在使用情境上还是有差别的,password 是会被透过网络传送到远端来让对方认证,会有被中途拦截而泄露的风险。而 passphrase 则是用在本地的电脑、取得私钥之用,所以并不是使用了金钥却还要使用密码的多此一举。同时,不要嫌安全设定麻烦,你觉得方便黑客也会觉得方便,万一被骇倒楣的还是自己。就像有一句网络上的玩笑话,装再好的锁也没有用,被侵入只是时间的问题,所以只要把锁装得比邻居好就行了。
产生好的文件会放在帐号所属 Home 路径的 .ssh 资料夹内,所以如果不确定是否已经产生过了,可以先到这个路径下来确认金钥产生的状态。产生好了之后就可以透过 SSH 把公钥档上传到 Server,公钥档的名称以之前的指令为例是 id_rsa.pub
。上传的指令示范如下:
scp ~/.ssh/id_rsa.pub root@remotehost:/tmp
接着就是设定服务器上的 SSH 环境,连线到 Server 运行以下的指令:
cd
mkdir .ssh
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
chmod -R go= ~/.ssh
要注意以上的指令是与帐号对应的,如果要使用 root 来连线,则要在 Server 上以 root 登入后运行。完成了之后就可以关闭 SSH 的密码登入,只允许使用金钥来做登入。设定的方式是修改 /etc/ssh/sshd_config
文件的下述两个参数:
PubkeyAuthentication yes
PasswordAuthentication no
设定 Git 环境
如果在安装 CentOS 时没有选择安装 Development Tools 的套件组合,则要先执行以下的指令,以便安装 Git 的套件:
yum -y install git
安装好了 Git 套件,可以先把安装 CentOS 就建立好的 git 帐号对应的 shell 更改为 git-shell,使连线进来的 Session 只能使用 Git 相关的指令,减少资安的风险。一般 git-shell 都是在 /usr/bin
下,如果不确定可以先使用 which git-shell
指令来查看实际安装的路径。
更改 shell 的方式是修改 /etc/passwd
文件,git 的资讯应该位在文件的最后一行,修改后的内容如下:
git:x:1000:1000::/home/git:/usr/bin/git-shell
接下来要设定让 Client 端可以使用 git 帐号来存取 Server 上的 Repository,跟之前的步骤一样,把上传到 tmp 下的公钥档加到 git 帐号所属的 authorized_keys 文件里:
cd
mkdir .ssh
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
chmod -R go= ~/.ssh
temp 下的 id_rsa.pub
已经没有作用了,可以把它删掉。再来就是依据实际的需求建立一到多个空的 Repository,指令示范如下:
cd /srv/git
mkdir project.git
cd project.git
git --bare init
chown -hR git:git /opt/git/project.git
要特别注意的事,由于 git 帐号被设定为使用 git-shell,所以以上的指令必须使用其他的帐号来进行,而且必须要有足够的权限。而在空的 Repository 建立好了之后,要做拥有权的移转,否则在 Push 时会出现以下的错误:
remote: error: insufficient permission for adding an object to repository database ./objects
error: unpack failed: unpack-objects abnormal exit
To git@remotehost:/srv/git/project.git
! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'git@remotehost:/srv/git/project.git’
回到 Cleint 端,建立本地的 Repository,但如果是第一次使用还没进行初次的设定作业,要先执行以下的指令:
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
接下来才是执行建立 Repository 的指令,其中 [path]
是 Repository 要建立的路径:
cd [path]
mkdir myproject
cd myproject
git init
都准备好了之后,就可以做第一次的 commit 并 push 要 Server 上:
git add .
git commit -m 'initial commit'
git remote add origin git@remotehost:/srv/git/project.git
git push origin master
如果一切正常,就完成了在 CentOS 上架设 Git Server 的工作。