目录1 共识节点推荐搭建步骤1.1 远程访问1.2 硬件1.31.3 密码2 SSH认证密钥3 服务供应商具体配置4 Linux服务器配置4.1 使用su时4.2 以管理员身份登录时4.2.1 防火墙4.2.2 自动安全更新4.2.3 fail2ban4.2.4 双因素认证4.2.5 监控4.2.6 登录成功邮件通知4.2.7 Logwatch4.2.8 黑名单USB和防火墙存储4.2.9 共识节点安装与运行4.3 其他安全推荐共识节点推荐搭建步骤远程访问机器的远程访问仅限使用公钥与Yubico4/NEO实体公钥进行SSH认证。硬件出于安全考虑,节点不应在共享的机器上运行,而应在Deltalis, Equinix及A1 Arsenal等安全性较高的数据中心通过托管的方式运行。下列laaS供应商硬件配置可作为2018年的理想配置参考。因为共识节点有计算功能,因此应定期检查网络硬件要求以保证最优性能。如果无法进行托管,推荐laaS供应商与最低配置如下:OVH EG-32CPU: Intel Xeon E3-1270v6 – 4c/8t – 3.8GHzRAM: 32GB DDR4 ECC 2133 MHzSSD: softraid-1 2x450GB NVMeNET: 1 GbpsPacket WorkhorseCPU: Intel® Xeon E3-1240v5 – 4c/8t – 3.5GHzRAM: 32 GB DDR3 ECC 1333 MHzSSD: softraid-1 2x120GB Enterprise SSDNET: 2 x 1 Gbps BondedLiquidwebCPU: Intel Xeon E3-1275v6 – 4c/8t – 3.8GHzRAM: 32 GB DDR4 ECCSSD: softraid-1 2x240GB Enterprise SSDNET: 1 Gbps密码使用密码管理工具存放本次搭建过程中所需的每个密码(推荐使用Lastpass和Dashlane),所有服务均应启用双因素认证和实体密钥(如有)。所有密码均应设置高强度密码(使用此 lastpass方案)。SSH认证密钥仅限使用公钥访问SSH认证可起到密钥保护的作用,所以我们要求使用实体OpenPGP智能卡进行SSH认证。我们推荐使用Ubikey 4。有关Yubikey PGP的更多性能请参考官方文档.完整Windows指南完整Linux/MacOS指南更改默认管理员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 updateapt-get upgradeCentOS:yum update添加管理员用户(两个管理员重复操作):useradd -m nodemkdir /home/node/.sshchmod 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_keyschown 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_resetDefaults mail_badpassDefaults 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 specificationroot 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 nodeexit再回到su,现在设置为仅可通过公钥与管理员登录SSH:vim /etc/ssh/sshd_config应添加下列行或在原有的基础上修改成如下形式,在AllowUsers中添加所有管理员并用空格键隔开:X11Forwarding noPermitRootLogin noPasswordAuthentication noAllowUsers nodeLoginGraceTime 30AllowTcpForwarding noTCPKeepAlive noAllowAgentForwarding noDebianBanner noBanner /etc/ssh/sshd-banner设置SSH的法律声明:echo “WARNING: Unauthorized access to this system is forbidden and will beprosecuted by law. By accessing this system, you agree that your actionsmay be monitored if unauthorized usage is suspected.” >> /etc/ssh/sshd-banner添加用户运行共识节点:useradd consensusmkdir /home/consensuschown consensus:consensus /home/consensus -R为共识节点创建一个非常强效的密码,应可安全地被两个管理员共享:passwd consensussu的最后一步就是以管理员身份登录后重启SSH。sudo systemctl restart sshd.service以管理员身份登录时防火墙首先在Debian(Ubuntu)中安装防火墙并锁定节点:sudo apt-get install ufwCentOS:sudo yum install epel-releasesudo yum install ufw在vim /etc/default/ufw中将IPV6设为yes,并设置为仅允许使用端口:sudo ufw default deny incomingsudo ufw allow sshsudo ufw allow 10333sudo ufw allow 20333sudo ufw disablesudo ufw enable自动安全更新Ubuntu:sudo apt-get install unattended-upgradessudo 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-cronsudo systemctl start yum-cronsudo systemctl enable yum-cronsudo nano /etc/yum/yum-cron.conf更改设置以匹配:update_cmd = securityapply_updates = yesemit_via = emailemail_to = YOUR_EMAIL_TO_RECEIVE_UPDATE_NOTIFICATIONS有更新时,使用email_to功能插入你想发送提醒的邮件地址。fail2ban接下来我们就来安装fail2ban,这个工具可禁止防火墙上的可疑IP。该工具的默认值就可使用,因此简单的安装就够了。Ubuntu:sudo apt-get install fail2banCentOS:sudo yum install fail2ban双因素认证将2FA与SSH的实体OpenPGP密钥相结合是强效认证设置。在Ubuntu中使用下列代码安装:sudo apt-get install libpam-google-authenticatorCentOS (启用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-authCentOS:#auth substack password-auth编辑sshd_config文件要求进行2FA认证:sudo vim /etc/ssh/sshd_config编辑文件允许认证,并添加认证方法行:ChallengeResponseAuthentication yesAuthenticationMethods 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 mailutilsCentOS: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 logwatchCentOS: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-storageblacklist firewire-core安装并运行共识节点在Unbuntu上安装前提条件:sudo apt-get install unzip sqlite3 libsqlite3-dev libleveldb-dev libunwind-devCentOS:sudo yum install unzip leveldb-devel libunwind-devel以共识节点用户的身份登录:su consensuscd ~在发行版中下载、验证校验和、解压最新版neo-cli客户端:wget https://github.com/neo-project/neo-cli/releases/download/v2.5.2/neo-cli-YOURDISTRIBUTION.zipsha256sum neo-cli-YOURDISTRIBUTION.zipunzip neo-cli-YOURDISTRIBUTION.zipcd neo-clichmod u+x neo-cli复制节点运行的设置(测试网或主网):mv protocol.json protocol.json.backcp protocol.testnet.json protocol.json如果这是首次操作,你需要给共识节点创建钱包:./neo-clineo> create wallet /home/consensus/cn_wallet.jsonpassword: SOMESTRONGPASSWORDpassword: SOMESTRONGPASSWORD复制start_consensus脚本:cd ~wget https://raw.githubusercontent.com/CityOfZion/standards/master/assets/nodes/start_consensus.shchmod u+x start_consensus.sh编辑目录使其与你的钱包文件地址及密码匹配。现在就可以在supervisord的控制下在Ubuntu上运行了:sudo apt-get install supervisorCentOS:sudo yum install supervisor配置supervisord以执行start_consensus(在需要的情况下编辑文件):wget https://raw.githubusercontent.com/CityOfZion/standards/master/assets/nodes/supervisord.confchmod 700 supervisord.confcp supervisord.conf /etc/supervisord.confsudo supervisord添加初始脚本以便在系统重启时自动运行。这就是全部步骤,现在登出服务器并仅在必须部署更新或检测到恶意行为时再重新登录。其他安全推荐GRUB密码磁盘加密开启TCP SYN Cookie功能(net.ipv4.tcp_syncookies = 1 -> /etc/sysctl.conf)原文翻译自CoZ:https://github.com/CityOfZion…