环境
-
有条件的情况下,请做到生产环境和测试/开发环境隔离
应该没人会希望自己修改测试环境的时候把生产环境玩炸了( -
建议使用Docker/CGroup等容器化方案来部署你的环境
这些容器技术非常方便你管理使用的环境和数据内容,也方便后期打包维护迁移
系统层面
-
选择一个LTS版本作为你稳定的生产环境和测试环境,非LTS版作为你的折腾环境
- LTS版本的系统提供更长时间的支持,至少在有效期内你的系统层面包含的软件包所产生的BUG会有相应的团队及时做更新。
- 非LTS版本一般表示用于开发和测试用途,系统在这段期间可能会有所修改和调整,甚至大的软件包变更,相对LTS版本会有所不稳定,而且支持期更短。
-
Ubuntu Server/CentOS/Debian 甚至Arch,使用哪个系统作为的发行版作为服务端的系统并没有什么不同,只是相对而言,Debian系(含Ubuntu)等其他发行版所包含的软件版本,会比RHEL系(CentOS类)所包含的软件版本要更新一些
- 虽然旧即是稳定,但我想了想应该没人会期望在9102年还在用4.4版本连C++11都支持不全的GCC去编译一个C++的代码的
- 但也不代表全新就是正义,大多数新版本软件包在投入生产环境使用之前经过一段时间的稳定性验证是非常必要的
-
请定期关注Linux Kernel的更新,例如最近几个月内的TCP MSS的DOS攻击,以及各种内核层面例如UAF(Use After Free)类问题导致的本地提权漏洞,这些需要你及时更新服务端的内核补丁,以保证正常安全运行
维护和软件
-
SSH
- 鉴于目前全世界24小时扫描爆破SSH 22端口的主机很多,请及时修改SSH默认端口22为其他端口
- 如果能禁用密码登录,强制使用ssh key登录,那就更好了 参考这里
- 当然你也可以使用基于ChallengeAuthentication的2FA认证,比如Google Authenticator (英文网页)
- 对于身处中国大陆的用户,非常不建议使用SSH直连境外22端口,也不建议直接使用SSH协议从服务端向国内传送大量数据,因为某个不可描述但众人皆知的东西。
-
请配置自动更新
- 软件包每隔一段时间会有新版本发布来修正一些特定的问题,因此除非你对某个版本的软件有特别的依赖,否则对于一个LTS系统而言,建议自动更新软件包以修正潜在的问题
- Ubuntu下有 unattended-upgrades 可以帮你做到,其他发行版应该也会有
-
请使用最小权限原则执行程序和脚本
- 我知道很多人(包括我自己)都是很喜欢用root直接去做一些事情的
- 但是出于安全角度考虑依然建议使用特定账户运行特定脚本/程序,以做到最小权限原则
- 为什么?参考服务器侧配置不当,多网站用户共享同一个user identity导致其中一个网站被黑以后,其他同用户下的网站一同被篡改的类似事件
-
请关注系统的负载和资源使用
- 这个应该不用多说吧,在运行的程序在多少任务量的情况下,应该吃掉多少资源产生多少负载,作为开发应该需要有一个观念
- 及时的监控告警可以帮你发现潜在的很多问题,比如应用BUG
数据
-
请务必勤备份,即便你在使用云服务等号称N个9加N份冗余备份的场景
- 你永远不知道下一个前沿数控事件会不会发生在自己身上
-
数据库一类的软件,请保持在仅能从内网或者本机自身访问
- 即使你设置了1145141919810个字符长度的密码也不要开放公网直接访问
- 已经有过不少3306 (MySQL) 或者 27017 (MongoDB) 被扫描爆破导致数据全丢的血泪教训了
- 大多数数据库软件的验证授权,在默认配置下是明文鉴权,这意味着中间网络设备是可以看到你用于认证的用户名和密码,以及后面操作产生的数据的
- 即便是测试环境一定要远程访问数据库,也建议通过加密隧道转发,并配置好访问策略(ACL)
权限管理
- 使用密钥登录服务器
- 禁用密码登录
- 修改 ssh 默认的 22 端口
使用密钥登录服务器
本地生成密钥(本地应该默认有 id_rsa
id_rsa.pub
密钥)
cd ~/.ssh
ssh-keygen -t rsa
将本地公钥上传到服务器
ssh-copy-id -i <id>_rsa.pub <host:port>
(或者)也可以手动将本地 <id_rsa.pub>
文件里的内容粘贴到目标服务器的 ~/.ssh/authorized_keys
文件里
服务器 ssh 配置文件 /etc/ssh/sshd_config
,修改端口,并禁止密码登录
#Port 22 -> Port 10086
#PasswordAuthentication yes -> PasswordAuthentication no
修改后重启生效
sudo /etc/init.d/ssh restart
连接 ssh
使用 socks5 连接 ssh
ssh -o ProxyCommand='nc -x 127.0.0.1:7891 %h %p' user@host
使用 ssh -L 参数做端口转发
比如转发 MySQL 端口,在连接 ssh 之后就可以本地访问线上服务器的数据库了
ssh user@host -L127.0.0.1:23306:172.31.0.222:3306
使用跳板机连接 ssh
ssh -J user@jump-host user@target-host