分类
开发规范 技术

服务器运维规范

目标

  • 保障服务器安全
  • 资源统一规划
  • 减少协作成本
  • 在保障安全的前提下尽可能提升效率

系统配置

操作系统

  • 采用最新的 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 密钥方式连接
  • 允许开发者之间互杀进程
    1. 使用 root 账户执行 visudo 命令,编辑 /etc/sudoers 文件,在文件末尾加入一行: %dev ALL=(%dev) NOPASSWD:/bin/kill
    2. 假设 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” 配置服务的参数