跳至内容
目标
- 保障服务器安全
- 资源统一规划
- 减少协作成本
- 在保障安全的前提下尽可能提升效率
系统配置
操作系统
- 采用最新的 Debian stable 发型版
Debian 是开源免费且及其稳定的 Linux 发行版。Ubuntu 基于 Debian,似乎更为流行,但是 Ubuntu 在软件稳定性方面会更加激进一些,且会附带一些不必要的功能。CentOS 继承自 REHL,本应作为首选,但今后 CentOS 将与 REHL 脱钩,失掉这一优势。此外,考虑到 Debian 系在容器和个人开发环境中占有较大优势,将服务器系统与之相统一可以带来许多便利。 - 管理员应定期检查并安装系统安全补丁
网络
- 严格管理系统入端口
仅开放 22、80、443 端口对外服务。此外,开放 9000-9100 之间的端口以便调试,比如通过端口转发连接到内部数据库。注意,开发端口的使用必须是临时性的,不得常驻服务。 - 尽量减少内部端口的使用
比如项目使用的数据库、redis,如无必要,不需要 expose 出来 - 8000-9000 范围内的端口供内部使用
无论能否用完,每个项目都占用 10 个端口,比如第一个项目占用 8000-8009,第二个项目占用 8010-8019 - 通常情况下其它端口都不得使用
账户和权限管理
- root
root 用户由技术部主管保管,密码不得公开,通常没有使用的必要。某些系统(比如 Debian)不开放 root 用户,故而不存在该问题。 - dev
- dev 用户是系统的主管理员账户,系统所有的部署工作和资源都应归属于 dev 用户或 dev 组。
- dev 用户具有 sudo 权限,可以执行系统任务
- dev 用户由技术部主管保管,密码不得公开
- dev 用户同时隶属于 nginx、docker 等组
- 系统所有重要资源应放置在 /home/dev 目录下,所有者为 dev:dev,文件权限 660,目录权限 770
- 更为重要的文件可以设置权限为 600
- 开发者用户
- 每个开发者都拥有自己的用户,这样当有员工离职,删除其账户不会影响到其它人
- 开发者账户由开发者自己保管,不得串用
- 用户名为员工姓名每个字的第一个小写字母,重复的后面加数字(从1开始)
- 开发者可以在 home 下拥有自己的目录,但所放内容是私人的、临时的
- 开发者用户隶属于 nginx、docker、dev 组
- 开发者离职后,使用 passwd -l $username 锁定用户账户
- 密码要求
- root、dev 用户名密码不得少于 12 位,必须包含大小写、数字、特殊字符
- 开发者账户密码不得少于八位,必须包含大小写和数字
- 建议设置复杂密码,通常使用 ssh 密钥方式连接
- 允许开发者之间互杀进程
- 使用 root 账户执行
visudo
命令,编辑 /etc/sudoers 文件,在文件末尾加入一行: %dev ALL=(%dev) NOPASSWD:/bin/kill
- 假设 foo 和 bar 用户同属于 dev 组,若 foo 要结束 bar 启动的进程,则执行
sudo -u bar kill {ps-number}
文件管理
- 所有的部署配置文件放置在 /home/dev 目录下,该目录拥有以下子目录:
- deployment: 所有部署文件,比如 docker-compose.yml
- project: 如果需要在服务器上开发调试,将代码拉到该目录下
- data: 数据资源
- bin: 常用程序
- usr: 手动安装的程序
- /home/dev 目录下的文件所有者为:xxx:dev,文件权限为 660,目录权限为 770
这样既实现了共享,也能清楚地看到每个文件是由谁负责的 - dev 和开发者都应将 umask 设置为 0007,保证所有在 /home/dev 目录下的文件都对 “other” 拒绝访问
- 开发者在 ~/.bash_profile 文件中设置
newgrp dev
,可以让自己新建的文件默认为 dev 组
Docker
- 同一项目的组件用 docker-compose 编排,不要混用数据库等通用组件
- 使用 volume 而不是本地挂载
- java 容器必须指定内存限制,初始为 512MB,若不够则每次增加 128MB
- 其它类型的容器也建议设置内存限制,试情况而定,但通常不会比 java 类容器多
- 基本组件的 image 必须指定版本号,应用的 image 可以使用 latest,以保持最新
- 自定义 image 统一使用 Debian buster slim 作为 base,第三方 image 也尽量基于此
- docker-compose version 3 开始需要基于 docker swarm,否则无法配置资源限制。因此我们使用 docker-compose version 的最高版本 2.4
- 可以将 docker-compose 提交到项目的代码库中,但不应包含任何敏感信息。服务器上使用 Environment Variable 和 “env_file” 配置服务的参数