惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

Nic Lin's Blog

謝明真 - 高效領導力的課後筆記 NFT 開發實戰!基礎智能合約入門 (3) NFT 開發實戰!基礎智能合約入門 (2) NFT 開發實戰!基礎智能合約入門 (1) 如何自我檢測 log4j CVE 漏洞 Rails 如何在資料寫入時記錄來源 IP 位置 如何經營工程師 Youtube 頻道 - Part 8 營收篇 如何經營工程師 Youtube 頻道 - Part 7 酸民文化篇 如何經營工程師 Youtube 頻道 - Part 5 設備器材篇 如何經營工程師 Youtube 頻道 - Part 4 後製剪輯篇 如何經營工程師 Youtube 頻道 - Part 3 文案企劃篇 如何經營工程師 Youtube 頻道 - Part 2 設備器材篇 如何經營工程師 Youtube 頻道 - Part 1 制訂頻道方向篇 如何經營工程師 Youtube 頻道 - Part 0 Rails 中避免 race condition 的最佳實踐(二) Rails 中避免 race condition 的最佳實踐(一) 10 分鐘整合 google sheet 做自動化開發功能週報 經營 Side Project 300 天所帶來的收穫及挑戰 我的 Youtube 影片製作流程 API 設計時必須注意的 HTTP header 底線問題 如何提升你的程式可讀性之實務技巧(三) 如何提升你的程式可讀性之實務技巧(二) 如何提升你的程式可讀性之實務技巧(一) Ruby 中使用 freeze 優化效能的時機 避免 React 中的 useEffect 無限 render 在 Rails 內輕量使用 Vue Component 的最佳實踐 從被問到問人,那些我常問的面試問題 [Rails] 如何漂亮寫出可維護的 query (Maintainable Rails Query) 在已知長度情況下優化 slice 的性能 [ReactNative] 如何在 iOS APP 上主動要求用戶評分 Rails 的 scope 為什麼用 lambda? Proc 與 lambda 不同之處 淺談 Active Record 的 Lazy load 特性 Rails 專案搭配 Github Actions 進行 RSpec 自動化測試 JavaScript 中 require, import 的差別及效能 React 效能優化基本招 ES6 箭頭函式 (Arrow functions) 2 個月擁有 6000 用戶 Side project 這樣做(一) 如何讓自己成為失敗的軟體工程師 如何用 Rack::Attack 阻擋 DDOS / 惡意流量 用 OpenSSL 自簽開發用 HTTPS SSL 憑證 為機器加上登入訊息,在 ubuntu 設置登入歡迎詞 Ruby Memoization 性能優化之記憶化 淺談 SSH agent forwarding 和 proxy command 的安全風險與應用 [Rails] Service / Library / Concern 的差異 避免過度的 Defensive Programming 防禦性程式設計 1:1 攪亂器,如何用 Ruby 做可逆推序號 Rails 中的欄位及方法命名原則 [Rails] 用 puma-dev 作為本地開發伺服器 (支援 https 自簽憑證) 將 Rails 專案從手動部屬遷移使用 Capistrano 自動化部屬 工程師提昇自己的教學和簡報技術的方法 [筆記] Rails 3.2 升級 Rails 6.beta 經驗分享 Class method 氾濫帶來什麼問題 RDBMS 課程心得與筆記 常用的 Rails 開發規範 Rest-Client 如何做 Basic Authentication 驗證 [Rails] 何為 tld_lebgth? 遵循 Semantic Versioning 軟體開發語意化版本管理 請直接在 MySQL 裡面直接用 utf8mb4 取代 utf8 如何解決在 awesome print 中遇到 ActionController::Parameters unable to convert unpermitted 如何在 Mac 上升級 PostgreSQL 並遷移資料 如何解決 Mysql2::Error: Incorrect string value 讀書心得 - 「信任因子:信任如何影響大腦運作、激勵員工、達到組織目標」 我是如何寫部落格筆記的 讀書心得 - 「先問,為什麼?:顛覆慣性思考的黃金圈理論,啟動你的感召領導力」 [Rails] 解決 Reset Password 帶來的 token 洩漏問題 我的軟體工程師生涯:如何挑選適合你的公司 Rails 中的 delegate 用法 淺述 SSR SPA 優缺點 Rails 非同步工作請用 Global ID [React] Class Component 傳遞 props 的 2 種方式 好用的隱私權政策 URL 自動生成 Rails 5.1 之後的 tag helper Rails 5.2 Encrypted Credentials 最近面試被給的建議和書單 一般架構需要用到 K8S 嗎 透過 commit SHA 找 github Pull request 從零搭建,如何讓 Rails 跑在 Kubernetes(k8s)(二) 從零搭建,如何讓 Rails 跑在 Kubernetes(k8s)(一) React Stateless Functional Components 搞懂 React 中的 state 和 props 物件導向基本原則 SOLID (Ruby Sample) 在以太坊智能合約上是可以預測隨機數的 在台灣租屋必須注意的事 Rails 5 簡單雙向加解密 如何用 ABA 培養自律型員工 不要在 rake task 中定義 method, 請用 RAKE::DSL rails 非hash只想用array輸出page 如何處理陣列裡有重複的值 [Rails] 如何重設你的專案名稱 Ruby on Rails install on Mac 安裝步驟 使用 Friendly_id 與 Babosa 美化你的Rails 網址 Junior Rails 兩個月實戰心得 Devise使用Google實作登入 [iterm2] 如何新增alias 一個新鮮人找尋Rails工作的面試經驗 如何讓兩個資料表建立關聯 routing 的 namespace strong parameter user story 的格式 user story 是什麼?
如何在區域網路用 Docker 架設有 SSL 的 Gitlab
Nic Lin · 2020-02-10 · via Nic Lin's Blog

為什麼要自架 Gitlab

經歷過在團隊中使用 Gitea 後發現實在太難用了,除了速度快以外實在感受不到什麼優點,不管是在 CI / Code review 的部分都差強人意,更不用說個單 Repo 關鍵字搜尋都沒有(版本 1.8.3 時,後面不清楚)。

所以決定來換個自架 Gitlab,不過基本上能用 SaaS 雲服務還是比較省事一些,真的覺得資安擺第一或是有更大的客製化需求在來自己搞一套 Git hosting 會是比較建議的作法,不然其實後續維護成本跟備份問題都是隱性成本。

其實這是很簡單的數學問題,如果要自己搞 git hosting,算一下人力架設成本還有機器錢、備份的心力,真的一年下來有省多少嗎?

不過既然要動手架,就一次搞定吧!

目標

  • 架設一台 Gitlab server 搭配 CI runner
  • 輸入內網 IP 例如 33.33.13.10 可以連到帶有自己簽名的 gitlab.cc

這邊的 gitlab.cc 是我自己定義的,你也可以嘗試定義其他例如 git.dev 之類的

也就是說我們期望這個 Gitlab 架設好,就可以馬上在專案內直接透過 yml 來寫我們的 CI 腳本,並且有專屬的自簽域名可以直接連線 https://gitlab.cc,也就是說打開瀏覽器不會被標示為不安全。

這次架設會用 Docker 來做,原因如下

  1. Gitlab 官方對 Docker 支持很好,更新升級都很容易
  2. 只要備份好檔案及 docker-compose 的設定,機器掛掉在開很快
  3. 未來接 K8S 容易

準備機器

準備一台機器架設在內網,並且 RAM 必須至少 4G

本說明可以使用 vagrant 來做練習

如果要架設在實際機器上,可以跳過本步驟

  1. 建立 Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.define :web1 do |web1_config|
    web1_config.vm.box = "ubuntu-16-04"
    web1_config.vm.host_name = "web-1"
    web1_config.vm.network "private_network", ip: "33.33.13.10"
    web1_config.vm.network "forwarded_port", guest: 80, host: 1234
    web1_config.vm.provider "virtualbox" do |v|
      v.memory = 4096
      v.cpus = 2
    end
  end
end
  1. vagrant up
  2. ssh vagrant@33.33.13.10
  3. password = vagrant

安裝 Docker

以 Ubuntu 為例,可以透過以下方式安裝最新版本

sudo apt-get -y remove docker docker-engine docker.io
sudo apt-get update
sudo apt-get -y install \
     apt-transport-https \
     ca-certificates \
     curl \
     software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
     "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
     $(lsb_release -cs) \
     stable"
sudo apt-get update
sudo apt-get install docker-ce

Docker compose

這裡的規劃用 Docker 在機器上運行,所以這台機器理想是跑兩個 Docker

  1. Gitlab 主站
  2. CI runner

先安裝 Docker compose

sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

1. Gitlab 主站架設

在機器上建立好一個 docker-compose.yml 的腳本

mkdir gitlab

cd gitlab

vim docker-compose.yml

version: '3.2'
services:

  gitlab:
    image: gitlab/gitlab-ce:latest
    hostname: gitlab.cc
    container_name: gitlab
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url "https://gitlab.cc"
        letsencrypt['enable'] = false
    volumes:
      - /gitlab/config:/etc/gitlab
      - /gitlab/logs:/var/log/gitlab
      - /gitlab/data:/var/opt/gitlab
    ports:
      - 443:443
      - 80:80
    extra_hosts:
      - "gitlab.cc:33.33.13.10"
    networks:
      - devel-net

networks:
  devel-net:

接著輸入 docker-compose up 就可以啟動服務了

大概一陣子啟動過後,會看到 Log 一直出現

cannot load certificate key "/etc/gitlab/ssl/gitlab.cc.key"

這是因為找不到 SSL 憑證的問題

先用 ctrl + C 暫時關閉 server

然後我們就自己簽一個吧!

自簽 SSL 憑證

在目錄下新建檔案 ssl.conf

cd gitlab

touch ssl.conf

[req]
prompt = no
default_md = sha256
default_bits = 2048
distinguished_name = dn
x509_extensions = v3_req

[dn]
[req]
prompt = no
default_md = sha256
default_bits = 2048
distinguished_name = dn
x509_extensions = v3_req

[dn]
C = TW
ST = Taiwan
L = Taipei
O = Duotify Inc.
OU = IT Department
emailAddress = admin@gitlab.cc
CN = gitlab.cc

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = gitlab.cc
DNS.2 = *.gitlab.cc

接著執行指令,進行簽名

openssl req -x509 -new -nodes -sha256 -utf8 -days 3650 -newkey rsa:2048 -keyout server.key -out server.crt -config ssl.conf

接下來我們會看到生成了兩支檔案,分別為公鑰(server.crt)和私鑰(server.key)。

也因為我們剛剛已經使用 docker-compose 來架設 gitlab,這時候伺服器的根目錄 /gitlab 下方已經有資料了。

請將公私鑰複製到資料夾內

  1. sudo cp server.key /gitlab/config/ssl/gitlab.cc.key
  2. sudo cp server.crt /gitlab/config/ssl/gitlab.cc.crt

這時候再次輸入 docker-compose up -d 啟動 server 應該可以看到沒有噴錯誤訊息了。

備註: 加入 -d 指的是跑 daemon 模式,也就是背景運作,這樣一來我們就不用一直開著 terminal 了

本機信任自簽憑證

在自己電腦裡面編輯自訂 host

sudo vim /etc/hosts

加入一條

gitlab.cc 33.33.13.10

然後將機器內的 server.crt 載下來

如果不知道怎麼下載下來,就直接複製內容,然後在自己電腦裡建一個 gitlab.cc.crt

內容大概是這樣

-----BEGIN CERTIFICATE-----
MIIDzjCCAragAwIBAgIJAO7WOlAKgdWBMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYD
VQQGEwJUVzEPMA0GA1UECAwGVGFpd2FuMQ8wDQYDVQQHDAZUYWlwZWkxFTATBgNV
BAoMDER1b3RpZnkgSW5jLjEWMBQGA1UECwwNSVQgRGVwYXJ0bWVudDEeMBwGCSqG
SIb3DQEJARYPYWRtaW5AZ2l0bGFiLmNjMRIwEAYDVQQDDAlnaXRsYWIuY2MwHhcN
MjAwMjEwMDgzNzUwWhcNMzAwMjA3MDgzNzUwWjCBkjELMAkGA1UEBhMCVFcxDzAN
BgNVBAgMBlRhaXdhbjEPMA0GA1UEBwwGVGFpcGVpMRUwEwYDVQQKDAxEdW90aWZ5
IEluYy4xFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxHjAcBgkqhkiG9w0BCQEWD2Fk
bWluQGdpdGxhYi5jYzESMBAGA1UEAwwJZ2l0bGFiLmNjMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAzzUycQAoKWsx4nFUTqj9n2HX8b9QHVBmeMN7S03V
EVWzf8hHXU8jpK1lQPoV/eDOiDL/J5K6M9bmHqW37Q2SiYF/logFfnvCca0m9HfG
aKwVf+rpuamLKDLXp5NRiNs3btRRdQbVZFnA+xmeoO+Xbyo8c2isFgzdXLrU4GTh
QFSBBzYtSmmJChBC3gjaAKRmlgkwQS7Adk+nL83+JuJY6X0wr67cPXqKcrkYnx12
Nq8MZXjvRcOSTyh87BZmgKDnUigA7o7gK0JgnaUUsPMokReGMOTIAwJAT1i86own
EFobxFOgOAhL8nVHUSeHz9nj4AyzN4iBTPWMitto+ez2+QIDAQABoyUwIzAhBgNV
HREEGjAYgglnaXRsYWIuY2OCCyouZ2l0bGFiLmNjMA0GCSqGSIb3DQEBCwUAA4IB
AQAdwNzHhNN+ue+HbwK1U2T7SbhuJdv9vCheb3YLuQfTJ5nYbiIKRAXEXu6rPguf
76xLVpd7dvbp3PTv6ZxXvyrz3myBSdJbMsaNSb6PIVJndXM21WqbwyGpfjeudN5L
NR8dZqQ6vQBEk5Ixsei+Xe6w0e0bXTJHq+QCBpKpn+R+hngni2W9j/qDPUiObqhr
Rj4DN5JcmAxCY0n+YorjzNuXQQGZhofBIhBSeghuKtON4bXMNuHvQEya49PDIh6s
a5G0GD15Sn6wh6D9dOBkizICENF8yRFdOJRL4QlLy+STHsgGKBfvcBysP8oCXTNG
UXrOnf1Pjk9v3PTXtSIc8PUn
-----END CERTIFICATE-----

接著將自簽證書匯入本機

打開「鑰匙圈存取」,如果不知道怎麼打開,在 Mac 右上角的放大鏡打開輸入 keychain 應該就有了

接著將證書檔案用拖曳的方式放到「系統」下

「找到 gitlab.cc」-> 點兩下之後選擇「信任」-> 「使用此憑證時完全相信」

完全關閉瀏覽器後輸入 https://gitlab.cc 應該可以看到自己架好的私人 Git hosting 了,而且帶自簽憑證哦

到這裡應該已經可以直接使用了!

第一個畫面是要你設定 root 的密碼,然後就登入吧

帳號: root 密碼: 第一個畫面讓你輸入兩遍的就是密碼了

2. CI Runner

自動化 CI 是很重要的一環,要能夠直接在專案下寫 CI 腳本就要有 runner 來幫你建造這些事物。

打開我們剛架設好的 gitlab.cc,進到後台 https://gitlab.cc/admin/runners

這裡會看到

  • 在安裝執行器時指定以下 URL: https://gitlab.cc/
  • 在安裝過程中使用此註冊憑證: tVFLiiXQxmNinxzzhyen

這是我們稍後註冊 runner 要的資訊,先記錄下來

先掛載 Runner docker

docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
--add-host gitlab.cc:33.33.13.10 \
gitlab/gitlab-runner:latest

接著我們要讓兩個 docker 跑在同一台機器下來自簽 SSL 互相溝通

必須將簽證放在 runner 指定的位置

/srv/gitlab-runner/config/certs/ca.crt

也就是說你必須複製一份過去

sudo cp server.crt /srv/gitlab-runner/config/certs/ca.crt

這樣才會自動去吃,這是預設值的坑

然後接下來不管是跑註冊還是啟動 runner 都一定要記得加上 add-hosts 來啟動 docker

不然之後他會直接吃 DNS 然後找不到自己的 IP

註冊 runner

docker run --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner --add-host gitlab.cc:33.33.13.10 gitlab/gitlab-runner register \
  --docker-privileged \
  --non-interactive \
  --executor "docker" \
  --docker-image alpine:latest \
  --url "https://gitlab.cc" \
  --registration-token "tVFLiiXQxmNinxzzhyen" \
  --tls-ca-file "/etc/gitlab-runner/certs/gitlab.cc.crt" \
  --description "docker-runner" \
  --tag-list "docker" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected"

回到 https://gitlab.cc/admin/runners 後台查看一下是不是已經註冊了一個 runner 呢?

重啟 runner 吃最新的設定 docker restart gitlab-runner

看 runner Log docker logs gitlab-runner

那就完成了這次的架設了

一開始 runner 只有 concurrency 只有設定 1 而已,如果多專案跑起來肯定會塞車的,可以到 sudo vim /srv/gitlab-runner/config/config.toml 這裡把數值調整大一些

這篇我該踩的應該都踩一輪了,整理了最簡化的指令跟步驟可以快速搞定一台帶簽證帶 Runner 的 Gitlab 了