Linux服务器部署规范(CentOS 6)

本规范主要用于团队内部服务器部署统一约定,当前使用 CentOS 6 作为模板。

安装

系统安装,最重要的一步就是磁盘分区规划:

  • 如果尚有磁盘空间,务必采用LVM,方便未来扩容
  • 空间划分要合理,/根分区,/data数据分区,如有必要应划分独立的日志分区 /var

服务器检查与初始化

检查CPU/内存/磁盘情况

top
fdisk -l

网络,主机名

vi /etc/sysconfig/network
hostname yaoniming

vi /etc/hosts

软件防火墙

部署阶段可以考虑关闭软件防火墙,生产环境务必开启(有硬件防火墙除外)

/etc/init.d/iptables stop
chkconfig iptables off

iptables 可以使用setup工具定义,但如果通过修改配置定义,注意 setup 可能会覆盖配置

SELINUX

关闭SELINUX (可能需要重启服务器):

sestatus
vi /etc/sysconfig/selinux

打开文件数限制

查看并修改 (可能需要重启服务器),当作为Webserver时,系统默认1024远远不够。

ulimit -a 

# 最下面增加
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft core unlimited
* hard core unlimited

内核参数调整 CentOS 6

主要为TCP一些参数调整,打开文件数限制,swap使用限制,调整需要重启服务器,可与上面两步一起调整。

注意最后两行参数。

net.unix.max_dgram_qlen = 100
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.msgmnb = 4203520
kernel.msgmax = 8192
kernel.msgmni = 256

net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.ip_local_port_range = 20000 65000

net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_mem  =   379008       505344  758016
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
net.ipv4.tcp_max_orphans = 3276800

net.ipv4.tcp_max_tw_buckets = 200000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 81920
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.route.max_size = 5242880
net.ipv4.tcp_max_tw_buckets = 200000
net.ipv4.tcp_synack_retries=3

fs.file-max =65536
vm.swappiness = 1

系统更新

安装软件前,需要先 yum update,因为大名鼎鼎的 bash 漏洞 (CentOS 6)

可以安装一些必须的软件和开发包,顺便通过此步检查yum配置

yum update

yum install gcc gcc-c++ autoconf automake make cmake libevent libtool libXaw expat-devel libxml2-devel libevent-devel asciidoc cyrus-sasl-devel cyrus-sasl-gssapi krb5-devel libtidy libxslt-devel python-devel openssl-devel gmp-devel
yum install wget mlocate screen ntp unzip zip parted  rsync tree vim lrzsz tcpdump telnet sysstat lsof strace iptraf iotop snappy snappy-devel

时间同步

先手动同步一次,然后加入到计划任务,每8小时同步一次

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ntpdate us.pool.ntp.org
echo "0 */8 * * * /usr/sbin/ntpdate us.pool.ntp.org" >> /var/spool/cron/root

/etc/init.d/crond restart

透明大页面

当服务器作为数据库、内存数据库、常驻任务服务器时(Redis、MySQL、Java、Hadoop等),启用透明大页面,它可能会导致重大的性能问题。

当服务器只用于Webserver(Nginx+PHP),可以忽略。

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 同时添加到系统启动脚本中
vi /etc/rc.local

服务器安全配置

避免系统管理弱口令

服务器、FTP、数据库等所有密码,请设置强有力密码,简单有效降低整体风险的安全漏洞,以下是关于一些强密码的建议:

  • 包括数字,符号,大小写字母组合
  • 密码长度应在12至14个字符,如果允许,可以更长。
  • 任何避免重复的密码,避免基于个人资料信息密码,如生日,姓名等。
  • 定时更换密码的习惯

尽管我们一再强调密码复杂度的重要性,还依然有许多弱密码的存在。

服务器SSH安全配置

互联网上无时不刻都有一些人四处开着扫描器进行弱密码扫描试探,SSH的22端口也不例外,在服务器上执行两条指令可查看所有登录成功与失败的日志:

查看成功登录的日志

shell> last | less 

查看登录失败的日志

shell> lastb | less

如果你没修改过,应该看到了血淋淋的记录,没准已经被干了。所以在安装操作系统系统并设置好密码后,最好修改SSH默认端口。

修改SSH服务端口

修改SSH配置文件,将其监听端口更改为大于10000的值,发挥您的想象力:

shell> vi /etc/ssh/sshd_config
Port 22345

修改iptables软件防火墙把默认的22端口改为刚才指定的端口,也可以使用 setup来进行配置iptables软件防火墙。

shell> vi /etc/sysconfig/iptables

重启iptables,或者使用 service iptables restart

关于SSH这些配置、端口的修改,一定要在修改后立即进行连接测试,以防由于误操作,断开了当前连接而无法再次连接主机。

禁止root账户远程登录

通过修改默认端口基本上可以阻挡99%恶意扫描信息(根据个人观察),紧接着要做的就是禁止root远程直接登录。因为通过分析扫描日志,你会发现root账户试探的次数一直是永居榜首:

shell> vi /etc/ssh/sshd_config
PermitRootLogin no

然后创建个普通账户,当我们需要远程连接的时候,先通过普通账户登录,再su -到root。普通账户的用户名需要你费心思创造个奇葩的,admin, linux, centos 这类的用户名请先去反思:

shell> useradd yaoniming
shell> passwd yaoniming

使用普通账户登录服务器后执行su –切换,注意su后面有个减号,是同时切换环境变量的意思

管理员组账号

我们更推荐使用管理员组登陆,策略如下:

管理员组用户可以直接使用sudo su -来切换到root账户,而不需要系统管理员告知root密码。

只有管理员组的用户才能使用su 切换到root,即使普通用户知道root密码

因为管理员组的用户权限极高,所以密码请参考强密码环节:

# 添加wheel管理员组用户
shell> useradd -g wheel yaoniming

# 限制wheel组用户才能su,去除该行注释
shell> vi /etc/pam.d/su
auth            required        pam_wheel.so use_uid

# wheel组可使用sudo,去除改行注释
shell> vi /etc/sudoers
%wheel  ALL=(ALL)       NOPASSWD: ALL

如果服务器是托管,SSH 相关修改一定要立即测试,否则这是个噩梦
如果服务器是托管,SSH 相关修改一定要立即测试,否则这是个噩梦
如果服务器是托管,SSH 相关修改一定要立即测试,否则这是个噩梦

限制服务器IP或VPN登入

某些情况有条件的情况下,我们可以限制SSH的来源IP以及通过VPN登入,进一步加强服务器的安全。

我始终认为安全不能怕麻烦,因为你方便,其他人也方便。

(未完待续)