iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 9
0

SSL的部分

看過昨天的SSH補充說明之後,相信即使新手也沒那麼害怕「憑證」了吧?
只是實務上,當你的機器愈來愈多,可能就需要「憑證管理」(這個今天沒有喔)

SSL的2必要元件

  • Private key (.key)
  • SSL certificate (.crt)
    自簽憑證
    如果是公司內部,其實自簽憑證就好了

指令操作

# 1.產生private key
$ openssl genrsa -out gitlab.key 2048

# 2.某某vm或服務(例如:iis、apache)產生certificate signing request (CSR)
$ openssl req -new -key gitlab.key -out gitlab.csr

3.作簽章(用private key對CSR作簽章)
$ openssl x509 -req -days 3650 -in gitlab.csr -signkey gitlab.key -out gitlab.crt
  • 加強server安全性
$ openssl dhparam -out dhparam.pem 2048 # 產生stronger DHE parameters

安裝憑證

/home/git/data是data store

gitlab預設會到/home/git/data/certs找憑證,而大神的image裡可用3個參數指定

  • SSL_KEY_PATH
  • SSL_CERTIFICATE_PATH
  • SSL_DHPARAM_PATH
$ mkdir -p /srv/docker/gitlab/gitlab/certs # 這是host的目錄喔,會對到gitlab的/home/git/data
$ cp gitlab.key /srv/docker/gitlab/gitlab/certs/
$ cp gitlab.crt /srv/docker/gitlab/gitlab/certs/
$ cp dhparam.pem /srv/docker/gitlab/gitlab/certs/
$ chmod 400 /srv/docker/gitlab/gitlab/certs/gitlab.key # read

# 下面4個--env,填到docker-compose.yml也是一樣的,
# 儘量寫在yml,否則下過哪些指令很難追,docker-compose要查、要刪container也較方便

$ docker run --name gitlab -d \
    --publish 10022:22 --publish 10080:80 --publish 10443:443 \
    --env 'GITLAB_SSH_PORT=10022' --env 'GITLAB_PORT=10443' \
    --env 'GITLAB_HTTPS=true' --env 'SSL_SELF_SIGNED=true' \
    --volume /srv/docker/gitlab/gitlab:/home/git/data \
    sameersbn/gitlab:11.2.3
到現在,http會redirected到https,如果你有用load balancer,就不能這樣設定囉

Client端的設定

  • 開發者們的瀏覽器要 -相信-> gitlab的ca憑證 <-相信- gitlab ci
    如果你是用外面買的ca憑證,就不用再建立信認了,因為os已經預設信認一些root ca了。
    而自架的ca server,我們的所有client都要相信這個ca server及它所發出的憑證

回到現在Ubuntu VM底下

$ cp gitlab.crt /usr/local/share/ca-certificates
$ update-ca-certificates
# 這個gitlab.crt分發給各client端(要用gitlab的開發者們),在他們的電腦把gitlab.crt加入「SSL憑證信認清單)

#如果沒加,用git時會這樣…

git clone https://git.local.host/gitlab-ce.git
fatal: unable to access 'https://git.local.host/gitlab-ce.git': server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
  • 在chrome、firefox也要加gitlab.crt

  • GitLab信任GitLab CI的self-signed SSL certificates
    預設放在/home/git/data/certs/ca.crt,可用SSL_CA_CERTIFICATES_PATH變更

  • 將gitlab-ci container的ca.crt --copy--> gitlab container的/home/git/data/certs/

ca.crt包含你要信任的root ca

設定HSTS,HTTP Strict Transport Security

(非必要,建議可不做)
讓瀏覽器強制使用 HTTPS,HSTS的設定在瀏覽器、也要瀏覽器支援,若設定太嚴格會造成Local端開發困難

  • 如果你設了反悔,就要在你的瀏覽器清掉該網站的HSTS參數
    chrome查相關資訊,找出domain刪除(firefox透過刪掉歷史資料來清HSTS)
    chrome://net-internals/#hsts
    chrome://net-internals/#dns

  • NGINX_HSTS_MAXAGE 從現在起,該網站只能透過https
    NGINX_HSTS_ENABLED = false # 也能disable HSTS

$ docker run --name gitlab -d \
 --env 'GITLAB_HTTPS=true' --env 'SSL_SELF_SIGNED=true' \
 --env 'NGINX_HSTS_MAXAGE=2592000' \ # 預設值31536000seconds,設0就disable
 --volume /srv/docker/gitlab/gitlab:/home/git/data \
 sameersbn/gitlab:11.2.3

load balancer使用HTTPS

(非必要,研究用,建議load balancer使用HAProxy)
像nginx/haproxy/hipache等locad balancers是用http跟後端ap連線,
這樣憑證設定就要設在locad balancer,而非container,否則會有資安風險

  • load balancer設定

使用HAProxy,請參考SeaN McGary大大的文章,有點舊了

HAProxy - route by domain name(2013)
http://seanmcgary.com/posts/haproxy---route-by-domain-name/

Using SSL/HTTPS with HAProxy(2014)
http://seanmcgary.com/posts/using-sslhttps-with-haproxy/

gitlab container維持下面2個環境參數
GITLAB_HTTPS = true # 留著
SSL_SELF_SIGNED = true # 拿掉這個參數

$ docker run --name gitlab -d \
    --publish 10022:22 --publish 10080:80 \
    --env 'GITLAB_SSH_PORT=10022' --env 'GITLAB_PORT=443' \
    --env 'GITLAB_HTTPS=true' \
    --volume /srv/docker/gitlab/gitlab:/home/git/data \
    sameersbn/gitlab:11.2.3

gitlab 對於 POST request的error respond會用422 HTTP Error,建議加反向代理reverse proxy config

proxy_set_header X-Forwarded-Ssl on; # (nginx format)

將gitlab repositories整合到redmine,作Issue Trackers

有關redmine可參考:https://afunction.gitbooks.io/tools/content/pms/redmine.html

讓redmine container吃的到gitlab的repositories資料,進而用redmine做issue track

使用sameersbn大神的docker-redmine image
https://github.com/sameersbn/docker-redmine

$ docker run --name=postgresql-redmine -d \
  --env='DB_NAME=redmine_production' \
  --env='DB_USER=redmine' --env='DB_PASS=password' \
  --volume=/srv/docker/redmine/postgresql:/var/lib/postgresql \
  sameersbn/postgresql:9.6-4


$ docker run --name=redmine -d \
  --link=postgresql-redmine:postgresql --publish=10083:80 \
  --env='REDMINE_PORT=10083' \
  --volumes-from=gitlab \ # 加這行,讓redmine讀得到/home/git/data/repositories
  --volume=/srv/docker/redmine/redmine:/home/redmine/data \
  sameersbn/redmine:3.4.6

網址:
http://localhost:10083

預設帳密:admin/admin

  • Host UID/GID Mapping
    gitlab container裡的git的UID、GID預設是1000,如果要改成你的host的git的UID、GID一樣
$ docker run --name gitlab -it --rm [options] \
    --env "USERMAP_UID=$(id -u git)" --env "USERMAP_GID=$(id -g git)" \ 
    sameersbn/gitlab:11.2.3

變更mapping之後,container裡的/home/git/data必須用新id作re-owned

$ docker run --name gitlab -d [OPTIONS] \
    sameersbn/gitlab:11.2.3 app:sanitize

其他全部yml環境變數請參考
https://hub.docker.com/r/sameersbn/gitlab/

Available Configuration Parameters

其他的參數們

Docker secrets
所有--env的環境變數可以放在secrets或config檔中,大神都幫我們做好了,請服用

用docker-compose或Docker Swarm都可以


https://github.com/sameersbn/docker-gitlab/tree/master/contrib/docker-swarm
下載

  • docker-compose.yml
  • gitlab.config
  • gitlab.secrets
    放在同一個目錄,就可以下docker-compose囉

###備份
利用gitlab定義的rake task來,備份&還原,所有git repositories、上傳文件、資料庫

  • 1.備份
$ docker-compose run --rm gitlab app:rake gitlab:backup:create
  • 2.還原
# List available backups
$ docker-compose run --rm gitlab app:rake gitlab:backup:restore 

# Choose to restore from 1417624827
$ docker-compose run --rm gitlab app:rake gitlab:backup:restore BACKUP=1417624827 
# 不會備份 ssh/ 目錄,這個要手動備
  • 3、備份排程 的 參數
    GITLAB_BACKUP_SCHEDULE # daily,weekly,monthly
    GITLAB_BACKUP_TIME # 預設是0400
    GITLAB_BACKUP_EXPIRY # 備份檔預設保留7天

  • Import bare git Repositories
    將repositories --copy--> repositories/

$ docker run --name gitlab -it --rm [OPTIONS] \
    sameersbn/gitlab:11.2.3 app:rake gitlab:import:repos
  • 用crontab排程
$ crontab -e
0 0 * * FRI docker run --name gitlab -it --rm [OPTIONS] \
    sameersbn/gitlab:11.2.3 app:rake gitlab:import:repos
  • 使用Cron排程語法(crontab在jenkins就有介紹過囉,再po一次)
* * * * * 每個星星用TAB或空白鍵格開
分(0-59)、時(0-23)、日(1-31)、月(1-12)、星期幾(日=0、一=1、二=2、三=3、四=4、五=5、六=6)
*代表所有都有效
2-10代表值2~10
A,B,C列舉多個值
例如:
0	12,18,0	*	*	*	// 每天的12點、18點、半夜12點(環點 = =)

image sameersbn/gitlab 大概就這樣啦,
更新真的很快,10/24截稿前,已經到sameersbn/gitlab:11.4.0,(4天前)

最後再po一次網址

更正:
gitlab自從8.0開始,gitlab-ci就併入GitLab CE囉,

還在使用gitlab舊版的朋友
gitlab---->database
gitlab-ci->database

可以考慮migration到新版gitlab
https://github.com/sameersbn/docker-gitlab-ci
https://github.com/sameersbn/docker-gitlab/blob/master/CI_MIGRATION.md


上一篇
day08_docker06_GitLab01_上集
下一篇
day10_docker08_GitLab-CI-(Multi)Runner
系列文
在地端建置Angular+ASP.NET Core的DevOps環境31

尚未有邦友留言

立即登入留言