環境設定

系統: linux mint
套件: sudo apt-get install openssh-server git

基本操作

安裝完openssh-server和git後,即可開始嘗試創建remote repository。
為了之後的安全性議題,創建一個新的帳號來管理git server

1
	sudo adduser git

下方指令新增project.git目錄做為remote repository
(我新增在此帳號的家目錄下,而git官方文件則是放在 /opt/git/ 裡)

1
2
3
4
su git
mkdir /home/git/project.git
cd /home/git/project.git
git --bare init

remote repository已經建立,可以開始使用。 git@gitserver 代表 登入帳號@serverIP位置
試著用ssh連線抓下git repository吧。

1
2
3
4
git clone git@gitserver:/home/git/project.git
git remote -v
origin git@gitserver:/home/git/project.git (fetch)
origin git@gitserver:/home/git/project.git (push)

當然push pull指令也沒問題囉~ 只要有該帳戶密碼即可。

1
2
git push origin master
git pull origin master

安全性議題 - SSH Public Key Authentication

上述推送git repository的流程中,只需要有帳號密碼即可登入。
我們可以改以更安全的SSH Public Key Authentication來登入

client

在terminal上輸入ssh-keygen
全部使用預設值後,成對的公私鑰會出現在~/.ssh裡

  • 公鑰:id_rsa.pub
  • 私鑰:id_rsa

公鑰長起來像這樣

1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4LojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4kYjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9EzSdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myivO7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPqdAv8JggJICUvax2T9va5 gsg-keypair

server

登入管理git server的帳戶

1
    su git

把允許連到這個server的用戶公鑰,複製貼上到~/.ssh/authorized_keys文件中。

1
2
    mkdir ~/.ssh
    vi ~/.ssh/authorized_keys

authorized_keys中,有幾個公鑰就放幾行。

1
2
3
4
    公鑰1
    公鑰2
    公鑰3
    ...

安全性議題 - 限制shell功能

如果有人遠端登入伺服器後,使用vi、rm、touch等指令隨便更改repository內容,豈不是很危險。
因此要限制此帳戶只能拿來做為唯一用途──推送版本庫。
將原本的bash-shell改為git-shell,使此帳戶只剩下git相關功能吧。
編輯權限檔

1
    sudo vim /etc/passwd

passwd檔案底會出現剛剛的帳戶,這行可能長這樣。

1
    git:x :1001:1001:/home/git:/bin/sh

由左到右分別代表
帳戶:密碼(以x代替):UID(使用者識別碼):GID(群組識別碼):家目錄位置:使用的shell
將shell替代成git-shell,使此帳戶只剩下git相關功能。

1
    git:x :1001:1001::/home/git:/usr/bin/git-shell

git-shell的位置可以用下列指令找到

1
    which git-shell

調整完權限後,再想以ssh登入此帳戶就會出現

1
2
3
4
5
6
7
8
    $ ssh git@gitserver
    Welcome to Linux Mint 17.1 Rebecca (GNU/Linux 3.13.0-37-generic x86_64)
    Welcome to Linux Mint
     * Documentation:  http://www.linuxmint.com
    Last login: Sat Jun  6 19:55:30 2015 from localhost
    fatal: Interactive git shell is not enabled.
    hint: ~/git-shell-commands should exist and have read and execute access.
    Connection to gitserver closed.

此帳號無法再使用shell囉~

reference