簡介
X-Road 是一套由愛沙尼亞信息系統管理局研發,可以集中管理的分佈式數據資料交換層,用來串起政府各部門、與企業甚至是跨國的加密訊息通道
X-Road 最少需要搭配以下組件
- Central Server,簡稱CS,用來管理Member與Client
- Security Server,簡稱SS,用來接收Client端Post的資料,打給另一台SS or API,支援SOAP與Rest API
- CA Server,簡稱CA,除了管理信用憑証之外,還要負責處理Timestamp Server與OCSP Server
- PostgreSQL,由X-Road預設採用的資料庫
相關運作可以參考以下圖示
環境配置
在架設之前,我們環境配置如下
OS: Ubuntu 18.04.3 User: petercheng
主機名 | IP |
---|---|
Central Server | 192.168.2.32 |
Security Server 1 | 192.168.2.33 |
Security Server 2 | 192.168.2.34 |
CA Server | 192.168.2.35 |
Configure Proxy | 192.168.2.36 |
PostgreSQL | 192.168.2.37 |
然後,我們透過以下指令,打出一個金鑰到各Server去,這樣可以讓我們Login時不用輸入密碼,方便接下來使用Ansible架設
- 新增金鑰(裡面無論出現什麼選項,預設一路Enter下去就好)
ssh-keygen
- 將金鑰傳到各Server去
ssh-copy-id 192.168.2.32
ssh-copy-id 192.168.2.33
ssh-copy-id 192.168.2.34
ssh-copy-id 192.168.2.35
ssh-copy-id 192.168.2.36
ssh-copy-id 192.168.2.37
- 安裝PostgreSQL
# 先Login到PostgreSQL
ssh 192.168.2.37
# 透過APT安裝PostgreSQL
sudo apt install postgresql postgresql-contrib
# 修改postgresql.conf,讓server可以允許所有地方來的連入
sudo vim /etc/postgresql/10/main/postgresql.conf
# 將設定檔裡面的listen_address改成以下
listen_addresses = '*'
# 修改pg_hba.conf,讓server可以允許任何使用者從所有地方連入
sudo vim /etc/postgresql/10/main/pg_hba.conf
# 將以下Script加入最後一行
host all all all md5
# 重新啟動PostgreSQL
sudo systemctl restart postgresql
# 切換使用者成為postgres後,進入psql介面
sudo -u postgres psql
# 設定預設PostgreSQL密碼,需輸入二次新密碼
\password
# 離開psql
\q
安裝X-Road
- 抓取X-Road原始碼
git clone https://github.com/nordic-institute/X-Road.git
- 修改X-Road Ansible主機設定
vim ansible/hosts/example_xroad_hosts.txt
# 將主機設定修改如下
#central servers (ubuntu)
[cs_servers]
192.168.2.32 ansible_ssh_user=petercheng
#security servers (ubuntu or rhel)
[ss_servers]
192.168.2.33 ansible_ssh_user=petercheng
192.168.2.34 ansible_ssh_user=petercheng
#configuration proxies (ubuntu)
[cp_servers]
192.168.2.36 ansible_ssh_user=petercheng
#certification authority, time stamping authority and ocsp service server (ubuntu)
[ca_servers]
192.168.2.35 ansible_ssh_user=petercheng
- 修改Central Server連入資料庫設定
vim ansible/vars_files/cs_database.yml
# 連入資料庫設定如下
database_host: "192.168.2.37:5432"
database_admin_password: "[你的postgres密碼]"
mask_local_postgresql: false
- 修改Security Server連入資料庫設定
vim ansible/vars_files/ss_database.yml
# 連入資料庫設定如下
database_host: "192.168.2.37:5432"
database_admin_password: "[你的postgres密碼]"
opmonitor_admin_password: ""
serverconf_username: "serverconf"
serverconf_password: ""
opmonitor_username: "opmonitor"
opmonitor_password: ""
messagelog_username: "messagelog"
messagelog_password: ""
mask_local_postgresql: false
- 運行Ansible,安裝時間大約2小時左右
註:建議每一台機器先跑過apt dist-upgrade,因為官方ansible有運行到這條,但是如果是有畫面要選擇的,透過ansible容易卡住無法運行
#進入ansible資料夾
cd ansible
#開始跑ansible,追加--ask-become-pass等一下會要求你輸入密碼,供sudo用
ansible-playbook -i hosts/example_xroad_hosts.txt xroad_init.yml --ask-become-pass
設定 X-Road
關於設定的部份,官方這邊有圖文教學手把手教學可以看
How to Configure Central Server
預設使用者帳密
帳號:xrd
密碼:secret
CA、OSCP、TSA所需的Key檔,可以在CA Server裡面的/home/ca/CA/certs中找到
Restful API
依照官方手把手圖文教學,我們預設在Central Server中,會有一個Member,細項如下
而在Security Server中,我們會有三個Client,分別是管理Security Server用、註冊Client用與測試用,細項如下
而我們將鼠標移到其中一個項目,它會顯示該項目的相關明細,分別是Instance、Class、Code、Subsystem,這些之後我們串API會用到
我們先進入ID是SUBSYSTEM : DEV : GOV : 1234 : Test的Client
點擊Services頁籤,並且輸入您的API所在的Domain Name or IP,輸入完畢按下OK按鈕
點擊你的新增的API,這時它會是紅字,我們可以按下ENABLE按鈕起動它
點擊REST底下的Test,然後按下ADD ENDPOINT,我們要追加API的路徑
按下OK回到Services頁籤之後,點擊ACCESS RIGHTS追加存取權
點擊ADD SUBJECTS
按下SEARCH,選擇允許存取的Client
回到Service頁籤,會發現POST /user/login從(0)變成了(1)
接下來我們要進行API試打,在試打之前,我先提供一段用Golang寫的API
package main
import (
"fmt"
"net/http"
)
func main() {
port := fmt.Sprintf(":%s", "80")
http.HandleFunc("/user/login", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World")
})
http.ListenAndServe(port, nil)
}
上方的程式碼會監聽機器的80 Port,當你進入/user/login之後,他會回傳一個Hello World的訊息給你
API Server IP: 192.168.56.119
這是原本打API的路徑
http://192.168.56.119/user/login
這是經過Security Server之後,打API的路徑
http://[你的Security Server IP or Domain Name]/r1/[Instance]/[Class]/[Code]/[Subsystem]/[Service Code]/user/login
Example
http://192.168.2.33/r1/DEV/GOV/1234/Test/Test/user/login
這是你HTTP Header需要傳的東西
Accept: application/json
X-Road-Client: [Instance]/[Class]/[Code]/[Subsystem]
Example
X-Road-Client: DEV/GOV/1234/Test
以上,只是關於透過Security Server打Restful API的小教學,X-Road還支持SOAP,你將WSDL的路徑給他就可以抓到全部的呼叫路徑,相較於Restful要自已設定路徑簡便許多,如果日後有用到串流、RPC、SOAP等,我會再追加上範例教學