前几年配置和维护服务器一直在用 FreeBSD,对 FreeBSD 有较深的感情。FreeBSD 是一个非常优秀的操作系统,稳定、高效、安全,在这一点上 CentOS 这类采用 Linux 内核的操作系统似乎还是有那么一点点差距。然而,基于 BSD 内核的 FreeBSD 一向有它的无奈,由于它的维护团队是个拥护开源免费的非商业组织,可能同其它商业组织的合作一向不顺畅,甚至没有合作。于是几乎所有的硬件厂商推出的各种 硬件,比如光纤卡之类,驱动程序一般仅仅提供 Windows、商业 Unix、Linux 平台的。而 FreeBSD 的做法只能是等他们的小组或某些组织根据那些 Unix 或 Linux 驱动程序重写出 FreeBSD 驱动程序,因此一些硬件的支持总是要滞后或者存在兼容性问题。此外还有一个原因,现在单位购买的商业软硬件系统越来越多,而这些系统有些也仅支持上面说的 三类平台,并不提供 FreeBSD 客户端,导致安装 FreeBSD 操作系统的服务器无法整合或者整合得很艰难。
所以现在准备慢慢转向 Linux 内核的操作系统。Red Hat 一向是 Linux 中的佼佼者,而它的商业化也十分成功,各种支持也十分广泛,但毕竟它的企业级版本已经完全商业化了,不想付钱怎么办,只能选免费的版本了。而它的免费分支 Fedora 主要是面向桌面用户和喜欢尝鲜的用户的。其它的 Linux 发行版有很多很多,其中在企业级服务器被采用最多的有 openSUSE、Debian、Slackware、Gentoo等一些老牌的以安全和稳定为特点的 Linux 操作系统,新兴的 Ubuntu 也向 Desktop 和 Server 两条路线同时进军,由于它的易用性,也越来越受关注和喜爱。而我看中了 CenOS,这个操作系统很年轻,但年轻并不意味着不成熟。其实 CentOS 是在 Red Hat 的企业版完全商业化后诞生的,官方 Wiki 的首页这样介绍它自己:
他们做的其实就是把 Red Hat 发行的企业版操作系统源代码重新编译,去除了商业成分,把由 Red Hat 提供的商业化的升级等服务转向由开源免费社区来支持。说白了,CenOS 大概可以说几乎就是免费的 Red Hat 企业版产品。所以肯定不会差到哪去,而我最看重的是,由此那些商业化的软硬件系统对它的支持应该没有问题了,这对于我使用新的硬件或者整合单位的应用是至 关重要的。What is CentOS?
CentOS is an Enterprise Linux distribution based on the freely available sources from Red Hat Enterprise Linux. Each CentOS version is supported for 7 years (by means of security updates). A new CentOS version is released every 2 years and each CentOS version is periodically updated (roughly every 6 months) to support newer hardware. This results in a secure, low-maintenance, reliable, predictable and reproducible Linux environment.
今后我配置的服务器将采用 CentOS 操作系统,下面简单记录了这个操作系统的安装、安全及性能等方面的配置过程,以 CentOS 5.5 为例。
CentOS 5 操作系统的安装
有官方重要的 Red Hat Enterprise Linux Documentation 作为参考,文档有完善的中文版本,毕竟是商业化的服务体系,有完善的支持。CentOS 作为 Red Hat Enterprise Linux 的克隆版,这些文档同样完全适用,所以这里不再具体描述每一步的过程,仅对其中的某些关键地方做一些探讨。关于安装模式的选择,有图形模式和文本模式,多数网管员会喜欢选择简洁高效的文本模式来安装,我也喜欢。但这里有一点要注意,官方有提示:
LVM 是 Linux 很强大的逻辑卷管理功能,在一些复杂的高级应用还是很有益处的。比如将来需要整合存储、在线动态调整存储空间等。当然这个还是有点复杂的,我目前还没有研 究过,而且对于普通的应用也不是特别必要的,所以还是老老实实的创建传统的一个个 ext3 分区。注意
请注意,在文本安装模式下,你不可能用 LVM(逻辑卷管理器)来查看现有的设置。LVM 只能在图形安装模式下用图形化的 Disk Druid 程序来设置。
关于分区方案,官方文档上也有注明,并且有专门的篇幅阐述在不同的硬件平台下如何创建分区:
根据这些建议,针对 x86、AMD64 和 Intel® 64 位系统架构 的服务器,我们应该创建至少创建如下分区:注记
如果你还没有计划怎么设置分区,你可以参考 第 25 章 磁盘分区简介 和 第 4.18.4 节 “推荐的分区方案”。 至少,你 需要一个大小合适的根分区和两倍于系统物理内存的交换分区。Itanium 系统的用户应该有一个大约 100 MB 的 FAT (VFAT) 格式的 /boot/efi/ 分区、至少 512 MB 的交换分区和大小合适的根分区(/)。
- 交换分区,内存在 2GB 以下时,交换分区应该是内存的两倍,内存在 2GB 以上时,交换分区应该是内存大小加 2GB;
- /boot 分区,100MB 足矣;
- / 分区,3.0GB – 5.0GB,3.0GB 大小的根分区仅允许你进行最小程度的安装,而 5.0GB 大小的根分区允许你执行完整安装,包括所有软件包组;
- 为某些应用创建单独分区,比如网站服务器最好创建一个单独的足够大的分区用来存放网站的内容,代理服务器最好创建单独的缓存文件存放分区等等,这要根据服务器的实际用途来综合考虑。
时区当然是选择 Asia/Shanghai 或 Asia/Chongqing,因为没有北京可选,两个都一样,都是 UTC + 8。
安装包的选择,官方没有太多介绍。针对服务器的话,最好什么都不要勾选,然后采用 Customize software selection,把基本的系统组件选中,其它的不要安装,也不需要 GUI 图形界面。将来服务软件的安装可以从各官方网站下载最新稳定版单独安装(用源代码包自行编译安装或用二进制分发包直接安装或通过 Yum 来自动安装),因为操作系统的发行版附带的软件包一般都比较过时了(当然,至于这个“过时”,CentOS 有它自己的观点和充分的理由,官方 Wiki 有 说明)。为了方便,可以只选中这么几项安装:
Administration Tools、Base、Development Tools、Network Servers、System Tools、Text-based Internet
到这里,操作系统就安装完成了,接下来还要做一些重要的调整。
CentOS 5 的一些调整
配置用户及限制 SU 权限
首先要做的是添加一个普通用户帐号,如 radmin,用作将来的远程 SSH 连接。添加用户的步骤如下:# useradd -G wheel radmin # passwd radmin Changing password for user radmin. New UNIX password:(这里输入的密码是看不见的) Retype new UNIX password:(再输入一遍,仍然不显示) passwd: all authentication tokens updated successfully.
默认情况下,任何用户都可以 su 到 root 用户,我们们现在就来做个限制,只允许 wheel 组内的用户才可以 su 到 root用户。编辑 su 的 PAM 配置文件 (/etc/pam.d/su),找到下面这行,把前面的注释 # 去掉:
auth required pam_wheel.so use_uid
配置 SSH,方便安全的远端操作
SSH 肯定要开的,但是开得不安全的话,将成为一个很大的隐患。我觉得在 /etc/ssh/sshd_config 配置文件中最起码要做这些调整:# 停用第 1 类协议 # SSH 可以采用两款协议:第 1 类及第 2 类协议。 # 较旧的第 1 类协议的安全性较低,因此它应该被停用: # Protocol 2,1 Protocol 2 # 采用非标准的端口 # (官方中文 Wiki 上的解释) # 根据缺省值,ssh 在端口 22 聆听进入的连接。 # 一个骇客如果要断定 ssh 是否在你的机器上运行,他最大可能就是扫描端口 22。 # 一个有效混淆他的方法就是在非标准的端口上运行 ssh。 # 任何未被使用的端口都可行,但首选的是 1024 以上的。 # 很多人选用 2222 作为替换的端口(它很易记),正如 8080 经常被用作 HTTP 的替换端口。 # 正由于这个原因令它不是个好的选择,因为任何扫描端口 22 的骇客亦不会放过端口 2222。 # 随机地选用一个未被使用的高位端口会比较合宜: Port 2345 #修改成自己想要的端口号 # 阻止 root 登录: PermitRootLogin no # 只允许 radmin 用户登录,然后就可以根据前面的设定,使用 su 到 root: AllowUsers radmin
# service sshd restart
# echo "sshd:ALL" >> /etc/hosts.deny # echo "sshd:10." >> /etc/hosts.allow
这样一来,如果给 radmin 设置足够强壮的密码,并且做到不定期更换,通过 SSH 客户端登录服务器已经足够安全了。当然,如果非常在意安全性,还有个增强安全的手段,就是采用公钥/私钥来验证。
SSH 客户端有很多,比如收费的 SecureCRT、免费的 PuTTY, 它们都有生成公钥 / 密钥对的功能。用它们的这个功能生成 SSH-2 RSA Key,然后分别保存公钥和密钥,密钥放置在软件规定的目录,而公钥需要上传至服务器上。假设公钥文件名为 id_rsa.pub,已经传至 radmin 的 home 目录,现在以 radmin 用户登录服务器,然后做以下操作:
如果没有 .ssh 目录,则先创建:
$ mkdir ~/.ssh
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
$ rm -f id_rsa.pub
$ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
# 停用口令验证,强制使用公钥 / 密钥对 PasswordAuthentication no
收窄个别挂载点的权限
官方中文 Wiki 里这么说:当你将分区划分好及设置尺寸后,你便可以尽量收窄个别挂载点的权限。只要情况容许,你便应该加入 nodev、nodexec 及 nosuid。下面是一个已经适切地收窄权限的 /etc/fstab 样例档:也就是说,我们应该根据我们的实际情况,尽量给一些挂载点加入 nodev、nodexec 及 nosuid,限制这些 dev、exec、suid 的功能属性,而达到收窄权限、增强安全的目的。
明显地,你需要修改这个样例来迎合你的系统。LVM、扇区名称、标签等都可以被更改。请不要只字不漏地复制这个样例档,并期望它适合你使用。/dev/VG_OS/lv_root / ext3 defaults 1 1 /dev/VG_OS/lv_tmp /tmp ext3 defaults,nosuid,noexec,nodev 1 2 /dev/VG_OS/lv_vartmp /var/tmp ext3 defaults,nosuid,noexec,nodev 1 2 /dev/data_vol/lv_home /home ext3 defaults,nosuid,nodev 1 2 /dev/VG_OS/lv_var /var ext3 defaults,nosuid 1 2 /dev/data_vol/lv_web /var/www ext3 defaults,nosuid,nodev 1 2 /dev/sda1 /boot ext3 defaults,nosuid,noexec,nodev 1 2 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 /dev/_VG_OS/lv_swap swap swap defaults 0 0
网页服务器的挂载亦可以被设置为 noexec,但这样做会影响到 cgi 类应用程序,与及依赖 execute bit hack 的服务器端包含档。如果你不会应用 cgi 程序,我推荐最低限度测试采用 noexec,并看看会否有副作用。
限制 root 用户权限
下面的命令实现两个目的,第一个是只允许 root 从 tty1 控制台登录,第二个不允许任何用户访问 root 的主目录:# echo "tty1" > /etc/securetty # chmod 700 /root
停用 IPv6
相信绝大多数网管员配置的服务器都不需要连接 IPv6 网络,因此停用 IPv6 模块是很有必要的。以下引自官方中文 Wiki:
- 编辑 /etc/sysconfig/network 并设置「NETWORKING_IPV6」为「no」
- 在 /etc/modprobe.conf 内加入以下内容:
alias ipv6 off alias net-pf-10 off另类做法(可能较容易,并适用于在任何有 /etc/modprobe.d 的发行内):
- 执行 /sbin/chkconfig ip6tables off 来停用 IPv6 防火墙
- 重新引导系统
# touch /etc/modprobe.d/disable-ipv6 # echo "install ipv6 /bin/true" >> /etc/modprobe.d/disable-ipv6
- 5.4 版的更新引进了符号/ipv6 模块的互赖性;因此,假若 IPv6 曾经以上述方法停用,当结合界面的驱动程序被升级到 5.4 后,内核的结合模块将会不能被装入。要让这个模块正常装入,请改用:
# touch /etc/modprobe.d/disable-ipv6 # echo "options ipv6 disable=1" >> /etc/modprobe.d/disable-ipv6
停用无线网络
绝大多数网管员配置的服务器也不需要连接无线网络,下面的操作通过 /etc/modprobe.d 内的黑名单文件来停用它们,同时也能避免系统内核升级后,它们又会再出现。# for i in $(find /lib/modules/`uname -r`/kernel/drivers/net/wireless -name "*.ko" -type f) ; do echo blacklist $i >> /etc/modprobe.d/blacklist-wireless ; done
一些 sysctl 安全设置参数
根据官方 Wiki 的解释,除了一些要用到多网口做特殊应用的服务器外,绝大多数只是利用一个网口以提供某一应用的服务器(比如网站服务器),可以在 /etc/sysctl.conf 文件中调整以下参数:net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.tcp_max_syn_backlog = 1280 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.tcp_timestamps = 0
通过 Yum 来安装软件和更新系统
在 CentOS 中安装软件是通过 Yum 工具下载安装预编译的 RPM 包来进行的,软件源是 CentOS 官方或第三方社区维护的一些软件仓库。取得 CentOS 的组件签署金钥
在使用 Yum 之前,必须安装 CentOS RPM 签署金钥,以便 RPM 能使用它来确定拥有合法签署的组件。然而基于安全理由,这个金钥在 CentOS 操作系统安装时不会被安装。我们需要通过以下命令来从 CentOS 的镜像网站导入:# rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
安装 ProtectBase 插件
从 CentOS 5 开始,Yum 工具默认启用了插件功能,官方 Wiki 推荐的插件里,FastestMirror 已经默认安装并启用了。而另一个 ProtectBase,官方 Wiki 介绍说:protectbase 的用处就是保护某些软件库被其它软件库的更新所取替。受保护的软件库不会被未受保护的软件库内较新的文件更新。我们推荐这个插件给任何经常启用第三方软件 库的人们,因为这些非 CentOS 的软件库可能会更新某些系统文件,有机会导致你的 CentOS 安装不稳定。所以如果有这个想法,可以安装这个插件。我没想法,所以我没安装。安装其实很简单,官方 Wiki 的 这个页面 有详细介绍。
用 Yum 来更新系统
Yum 用法很简单,首先检查是否有软件更新:# yum check-update
# yum update
# yum upgrade
# yum clean all
让 Yum 自动更新
有个 Yum 软件包 yum-cron 能完整这个任务,可以通过下面的命令安装:# yum -y install yum-cron
另外,官方 Wiki 的 这篇文档 里提供了另一种方法,直接创建了几个脚本放在系统对应目录中,号称他这个脚本相对占用较少资源。如果用他这个方法的话,记得创建好 /etc/cron.daily/yum.cron 文件后,增加执行属性:
# chmod +x /etc/cron.daily/yum.cron
利用 ntpd 同步时间
一般来说,让服务器一直保持标准时间是很重要的。做到这一点,明显要用到 NTP 服务。而从网络上同步标准时间有两个做法,一个是 ntpdate 命令,一个是 ntpd 守护进程。ntpdate 命令同步时间是立即生效的,不管本地时间和标准时间是不是差得离谱。命令的用法也很简单,如下即可:# ntpdate cn.pool.ntp.org
对于一个长时间开机的服务器来说,通过 ntpd 守护进程来同步时间是一个更好的办法。它根据本地时间和标准时间之间的漂移量,让本地时间慢慢的调整到标准时间,这样就不会影响一些对时间敏感的程序的运 行,而且不再需要管理员去手动运行命令。但是它有个限制,当本地时间和标准时间差别太大的时候,它会报错,不允许调整。这时就要先用 ntpdate 手动同步一下时间,然后再启用 ntpd 进程。
ntp 组件在 CenOS 5 操作系统安装的时候已经装好,如果没有的话可以通过下面的命令安装:
# yum -y install ntp
# Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). # server 0.centos.pool.ntp.org # server 1.centos.pool.ntp.org # server 2.centos.pool.ntp.org server 1.cn.pool.ntp.org server 3.asia.pool.ntp.org server 0.asia.pool.ntp.org
# service ntpd start
# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *61.153.197.226 209.81.9.7 2 u 105 256 377 7.034 -27.129 10.355 +202.71.100.89 91.189.94.4 3 u 321 256 336 645.352 107.986 3.440 +ns1.arianrp.ir 129.6.15.28 2 u 80 256 363 540.304 -22.287 4.882 LOCAL(0) .LOCL. 10 l 7 64 377 0.000 0.000 0.001
# chkconfig ntpd on
停止无用服务(守护进程)
CentOS 默认开机自动启动的守护进程中,可能有一些对于我们针对某些单独应用的服务器不是必需的,所以我们要根据实际情况停用一些守护进程。进行这一操作的是 chkconfig 命令。chkconfig 命令的用法很简单:usage: chkconfig --list [name] chkconfig --addchkconfig --del chkconfig [--level ]
# ntsysv
非正常关机的自动磁盘修复配置
如果由于种种原因,服务器非正常关机了,比如死机、强制关机或复位、突然断电等,如果有正在打开的文件,很可能发生文件系统的一些错误,检查文件系 统并修复错误的命令是著名的 fsck。通过创建 /etc/sysconfig/autofsck 文件,设置如下内容,能够在非正常关机后,系统启动时自动运行 fsck 命令来检查并修复文件系统错误:# 启动自动检查的功能 AUTOFSCK_DEF_CHECK=yes # 对所有的提示都回答 yes PROMPT=yes
No comments:
Post a Comment