NEO共識節點推薦搭建步驟

NEO技術飯發表於2018-12-24

目錄

共識節點推薦搭建步驟

遠端訪問

機器的遠端訪問僅限使用公鑰與Yubico4/NEO實體公鑰進行SSH認證。

硬體

出於安全考慮,節點不應在共享的機器上執行,而應在Deltalis, Equinix及A1 Arsenal等安全性較高的資料中心通過託管的方式執行。下列laaS供應商硬體配置可作為2018年的理想配置參考。

因為共識節點有計算功能,因此應定期檢查網路硬體要求以保證最優效能。

如果無法進行託管,推薦laaS供應商與最低配置如下:

  • OVH EG-32
    • CPU: Intel Xeon E3-1270v6 – 4c/8t – 3.8GHz
    • RAM: 32GB DDR4 ECC 2133 MHz
    • SSD: softraid-1 2x450GB NVMe
    • NET: 1 Gbps
  • Packet Workhorse
    • CPU: Intel® Xeon E3-1240v5 – 4c/8t – 3.5GHz
    • RAM: 32 GB DDR3 ECC 1333 MHz
    • SSD: softraid-1 2x120GB Enterprise SSD
    • NET: 2 x 1 Gbps Bonded
  • Liquidweb
    • CPU: Intel Xeon E3-1275v6 – 4c/8t – 3.8GHz
    • RAM: 32 GB DDR4 ECC
    • SSD: softraid-1 2x240GB Enterprise SSD
    • NET: 1 Gbps

密碼

使用密碼管理工具存放本次搭建過程中所需的每個密碼(推薦使用Lastpass和Dashlane),所有服務均應啟用雙因素認證和實體金鑰(如有)。

所有密碼均應設定高強度密碼(使用此 lastpass方案)。

SSH認證金鑰

僅限使用公鑰訪問SSH認證可起到金鑰保護的作用,所以我們要求使用實體OpenPGP智慧卡進行SSH認證。我們推薦使用Ubikey 4。有關Yubikey PGP的更多效能請參考官方文件.

更改預設管理員PIN碼 12345678 與PIN碼 123456 為可記憶的安全密碼。

將您的私鑰新增到智慧卡啟用的認證代理服務後,gpg-agent就會與gpg2繫結——這是我們推薦的步驟。

服務供應商具體配置

開啟供應商防火牆(不在OS設定中),設定為遮蔽全部,埠22、20333與10333除外。若有其他服務共享同一賬戶,請務必確保將節點放置在反關聯性群組中。

Linux伺服器配置

需給每個節點在兩個轄區分別配置2個管理員。每個管理員都應有一個可以登入系統的專屬使用者和一個(SSH無權訪問的)第三方共識使用者,並且僅可通過該第三方共識使用者訪問共識節點的私鑰(注意本指南使用的Ubuntu版本是16.04 LTS)。

首次登入時,設定一個強效根密碼,但僅在遺失sudo密碼(或進行撤銷操作)時才需使用根密碼;

su (sudo su on Ubuntu)
passwd複製程式碼

仍在使用su時

Ubuntu更新包:

apt-get update
apt-get upgrade複製程式碼

CentOS:

yum update複製程式碼

新增管理員使用者(兩個管理員重複操作):

useradd -m node
mkdir /home/node/.ssh
chmod 700 /home/node/.ssh複製程式碼

本指南是基於bash編制的,所以在shell下拉選單中將bash設為偏好值:

usermod -s /bin/bash node複製程式碼

從管理員的 ssh-add -L中將Yubikey公鑰複製到authorized_keys:

vim /home/node/.ssh/authorized_keys複製程式碼

許可設定:

chmod 400 /home/node/.ssh/authorized_keys
chown node:node /home/node -R複製程式碼

設定管理員密碼(這就是sudo密碼):

passwd node複製程式碼

接下來我們就可以設定管理員的sudo了,新增 %sudo 群組,註釋非 root的任何其他群組時使用#:

visudo複製程式碼

檔案格式如下:

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"# Host alias specification# User alias specification# Cmnd alias specification# User privilege specification
root    ALL=(ALL:ALL) ALL
​
# Members of the admin group may gain root privileges
#%admin ALL=(ALL) ALL# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
​
# See sudoers(5) for more information on "#include" directives:#includedir /etc/sudoers.d複製程式碼

將管理員新增到sudo群組:

usermod -aG sudo node複製程式碼

需登入並登出管理員賬戶後才能完成更新:

su -l node
exit複製程式碼

再回到su,現在設定為僅可通過公鑰與管理員登入SSH:

vim /etc/ssh/sshd_config複製程式碼

應新增下列行或在原有的基礎上修改成如下形式,在AllowUsers中新增所有管理員並用空格鍵隔開:

X11Forwarding no
PermitRootLogin no
PasswordAuthentication no
AllowUsers node
LoginGraceTime 30
AllowTcpForwarding no
TCPKeepAlive no
AllowAgentForwarding no
DebianBanner no
Banner /etc/ssh/sshd-banner複製程式碼

設定SSH的法律宣告:

echo "WARNING:  Unauthorized access to this system is forbidden and will be
prosecuted by law. By accessing this system, you agree that your actions
may be monitored if unauthorized usage is suspected." >> /etc/ssh/sshd-banner複製程式碼

新增使用者執行共識節點:

useradd consensus
mkdir /home/consensus
chown consensus:consensus /home/consensus -R複製程式碼

為共識節點建立一個非常強效的密碼,應可安全地被兩個管理員共享:

passwd consensus複製程式碼

su的最後一步就是以管理員身份登入後重啟SSH。

sudo systemctl restart sshd.service複製程式碼

以管理員身份登入時

防火牆

首先在Debian(Ubuntu)中安裝防火牆並鎖定節點:

sudo apt-get install ufw複製程式碼

CentOS:

sudo yum install epel-release
sudo yum install ufw複製程式碼

vim /etc/default/ufw中將IPV6設為yes,並設定為僅允許使用埠:

sudo ufw default deny incoming
sudo ufw allow ssh
sudo ufw allow 10333
sudo ufw allow 20333
sudo ufw disable
sudo ufw enable複製程式碼

自動安全更新

Ubuntu:
sudo apt-get install unattended-upgrades
sudo vim /etc/apt/apt.conf.d/10periodic複製程式碼

更新以匹配:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";複製程式碼

禁止不安全的自動更新:

sudo vim /etc/apt/apt.conf.d/50unattended-upgrades複製程式碼

更新,未註釋的行有且僅有以下幾行:

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}";
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESM:${distro_codename}";
};複製程式碼
CentOS:

安裝yum-cron並允許安全包更新:

sudo yum -y install yum-cron
sudo systemctl start yum-cron
sudo systemctl enable yum-cron
sudo nano /etc/yum/yum-cron.conf複製程式碼

更改設定以匹配:

update_cmd = security
apply_updates = yes
emit_via = email
email_to = YOUR_EMAIL_TO_RECEIVE_UPDATE_NOTIFICATIONS複製程式碼

有更新時,使用email_to功能插入你想傳送提醒的郵件地址。

fail2ban

接下來我們就來安裝fail2ban,這個工具可禁止防火牆上的可疑IP。該工具的預設值就可使用,因此簡單的安裝就夠了。Ubuntu:

sudo apt-get install fail2ban複製程式碼

CentOS:

sudo yum install fail2ban複製程式碼

雙因素認證

將2FA與SSH的實體OpenPGP金鑰相結合是強效認證設定。在Ubuntu中使用下列程式碼安裝:

sudo apt-get install libpam-google-authenticator複製程式碼

CentOS (啟用epel——同上):

sudo yum install google-authenticator複製程式碼

安裝完畢後,以管理員身份執行指令時遵循每步指令,(回答y/y/y/n/y),先以管理員身份(兩個)進行這步操作,完成後再更新PAM獲得2FA:

google-authenticator複製程式碼

接下來編輯SSH配置來獲得2FA設定許可:

sudo vim /etc/pam.d/sshd複製程式碼

在檔案結尾新增以下行:

auth required pam_google_authenticator.so複製程式碼

在Ubuntu中放入密碼提示的註釋行:

# Standard Un*x authentication.
#@include common-auth複製程式碼

CentOS:

#auth       substack     password-auth複製程式碼

編輯sshd_config檔案要求進行2FA認證:

sudo vim /etc/ssh/sshd_config複製程式碼

編輯檔案允許認證,並新增認證方法行:

ChallengeResponseAuthentication yes
AuthenticationMethods publickey,password publickey,keyboard-interactive複製程式碼

重啟SSHD服務:

sudo systemctl restart sshd.service複製程式碼

在保持當前SSH視窗執行的同時開啟另一個視窗,並登入以確認設定能正確執行。

監視

保持對共識節點的監視對於發現問題及改善NEO專案而言是至關重要的。我們僅會通過SSH通道安裝並訪問網路資料庫(保留防火牆攔截設定)。

安裝預購建靜態版本(以減少攻擊面並杜絕不必要的依賴性):

bash <(curl -Ss https://my-netdata.io/kickstart-static64.sh)複製程式碼

訪問方法是建立SSH通道並開啟瀏覽器訪問localhost:19999:

ssh -f node@SERVERIP -L 19999:SERVERIP:19999 -N複製程式碼

登入成功郵件通知

sudo apt-get install mailutils複製程式碼

CentOS:

sudo yum install mailx複製程式碼

編輯預設bash檔案:

sudo vim /etc/profile複製程式碼

在檔案結尾新增以下行,編輯郵箱使其可接收登入通知:

SIP="$(echo $SSH_CONNECTION | cut -d " " -f 1)"
SHOSTNAME=$(hostname)
SNOW=$(date +"%e %b %Y, %a %r")
echo 'Someone from '$SIP' logged into '$SHOSTNAME' on '$SNOW'.' | mail -s 'SSH Login Notification' 'YOUR@EMAIL.HERE'複製程式碼

Logwatch

在Ubuntu上配置logwatch以傳送節點的日常活動總結(通常無活動):

sudo apt-get install logwatch複製程式碼

CentOS:

sudo yum install logwatch複製程式碼

現在新增cron job將總結髮送到你的郵箱:

sudo vim /etc/cron.daily/00logwatch複製程式碼

將預設執行命令變更為:

/usr/sbin/logwatch --output mail --mailto YOUR@EMAIL.HERE --detail high複製程式碼

黑名單USB與防火牆儲存

我們會把不需要的模組放入黑名單以減少攻擊面,WiFi和藍芽通常已經與伺服器核心切斷了(需驗證!),因此僅需關閉USB儲存。

sudo vi /etc/modprobe.d/blacklist.conf複製程式碼

新增以下行:

blacklist usb-storage
blacklist firewire-core複製程式碼

安裝並執行共識節點

在Unbuntu上安裝前提條件:

sudo apt-get install unzip sqlite3 libsqlite3-dev libleveldb-dev libunwind-dev複製程式碼

CentOS:

sudo yum install unzip leveldb-devel libunwind-devel複製程式碼

以共識節點使用者的身份登入:

su consensus
cd ~複製程式碼

在發行版中下載、驗證校驗和、解壓最新版neo-cli客戶端:

wget https://github.com/neo-project/neo-cli/releases/download/v2.5.2/neo-cli-YOURDISTRIBUTION.zip
sha256sum neo-cli-YOURDISTRIBUTION.zip
unzip neo-cli-YOURDISTRIBUTION.zip
cd neo-cli
chmod u+x neo-cli複製程式碼

複製節點執行的設定(測試網或主網):

mv protocol.json protocol.json.back
cp protocol.testnet.json protocol.json複製程式碼

如果這是首次操作,你需要給共識節點建立錢包:

./neo-cli
neo> create wallet /home/consensus/cn_wallet.json
password: SOMESTRONGPASSWORD
password: SOMESTRONGPASSWORD複製程式碼

複製start_consensus指令碼:

cd ~
wget https://raw.githubusercontent.com/CityOfZion/standards/master/assets/nodes/start_consensus.sh
chmod u+x start_consensus.sh複製程式碼

編輯目錄使其與你的錢包檔案地址及密碼匹配。現在就可以在supervisord的控制下在Ubuntu上執行了:

sudo apt-get install supervisor複製程式碼

CentOS:

sudo yum install supervisor複製程式碼

配置supervisord以執行start_consensus(在需要的情況下編輯檔案):

wget https://raw.githubusercontent.com/CityOfZion/standards/master/assets/nodes/supervisord.conf
chmod 700 supervisord.conf
cp supervisord.conf /etc/supervisord.conf
sudo supervisord複製程式碼

新增初始指令碼以便在系統重啟時自動執行。

這就是全部步驟,現在登出伺服器並僅在必須部署更新或檢測到惡意行為時再重新登入。

其他安全推薦

  • GRUB密碼
  • 磁碟加密
  • 開啟TCP SYN Cookie功能(net.ipv4.tcp_syncookies = 1 -> /etc/sysctl.conf)

原文翻譯自CoZ:github.com/CityOfZion/…

NEO開發者交流QQ群:795681763

相關文章