Monday, October 24, 2011

[转]CentOS 5.x 系统安装配置

原文 : http://hzhawk.cjlu.edu.cn/network-service/centos-5x-install-setting/

前几年配置和维护服务器一直在用 FreeBSD,对 FreeBSD 有较深的感情。FreeBSD 是一个非常优秀的操作系统,稳定、高效、安全,在这一点上 CentOS 这类采用 Linux 内核的操作系统似乎还是有那么一点点差距。然而,基于 BSD 内核的 FreeBSD 一向有它的无奈,由于它的维护团队是个拥护开源免费的非商业组织,可能同其它商业组织的合作一向不顺畅,甚至没有合作。于是几乎所有的硬件厂商推出的各种 硬件,比如光纤卡之类,驱动程序一般仅仅提供 Windows、商业 Unix、Linux 平台的。而 FreeBSD 的做法只能是等他们的小组或某些组织根据那些 Unix 或 Linux 驱动程序重写出 FreeBSD 驱动程序,因此一些硬件的支持总是要滞后或者存在兼容性问题。此外还有一个原因,现在单位购买的商业软硬件系统越来越多,而这些系统有些也仅支持上面说的 三类平台,并不提供 FreeBSD 客户端,导致安装 FreeBSD 操作系统的服务器无法整合或者整合得很艰难。

所以现在准备慢慢转向 Linux 内核的操作系统。Red Hat 一向是 Linux 中的佼佼者,而它的商业化也十分成功,各种支持也十分广泛,但毕竟它的企业级版本已经完全商业化了,不想付钱怎么办,只能选免费的版本了。而它的免费分支 Fedora 主要是面向桌面用户和喜欢尝鲜的用户的。其它的 Linux 发行版有很多很多,其中在企业级服务器被采用最多的有 openSUSEDebianSlackwareGentoo等一些老牌的以安全和稳定为特点的 Linux 操作系统,新兴的 Ubuntu 也向 Desktop 和 Server 两条路线同时进军,由于它的易用性,也越来越受关注和喜爱。而我看中了 CenOS,这个操作系统很年轻,但年轻并不意味着不成熟。其实 CentOS 是在 Red Hat 的企业版完全商业化后诞生的,官方 Wiki 的首页这样介绍它自己:

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.
他们做的其实就是把 Red Hat 发行的企业版操作系统源代码重新编译,去除了商业成分,把由 Red Hat 提供的商业化的升级等服务转向由开源免费社区来支持。说白了,CenOS 大概可以说几乎就是免费的 Red Hat 企业版产品。所以肯定不会差到哪去,而我最看重的是,由此那些商业化的软硬件系统对它的支持应该没有问题了,这对于我使用新的硬件或者整合单位的应用是至 关重要的。
今后我配置的服务器将采用 CentOS 操作系统,下面简单记录了这个操作系统的安装、安全及性能等方面的配置过程,以 CentOS 5.5 为例。

CentOS 5 操作系统的安装

有官方重要的 Red Hat Enterprise Linux Documentation 作为参考,文档有完善的中文版本,毕竟是商业化的服务体系,有完善的支持。CentOS 作为 Red Hat Enterprise Linux 的克隆版,这些文档同样完全适用,所以这里不再具体描述每一步的过程,仅对其中的某些关键地方做一些探讨。

关于安装模式的选择,有图形模式和文本模式,多数网管员会喜欢选择简洁高效的文本模式来安装,我也喜欢。但这里有一点要注意,官方有提示:

注意

请​注​意​,在​文​本​安​装​模​式​下​,你​不​可​能​用 LVM(逻​辑​卷​管​理​器​)来​查​看​现​有​的​设​置​。​LVM 只​能​在​图​形​安​装​模​式​下​用​图​形​化​的 Disk Druid 程​序​来​设​置​。
LVM 是 Linux 很强大的逻辑卷管理功能,在一些复杂的高级应用还是很有益处的。比如将来需要整合存储、在线动态调整存储空间等。当然这个还是有点复杂的,我目前还没有研 究过,而且对于普通的应用也不是特别必要的,所以还是老老实实的创建传统的一个个 ext3 分区。

关于分区方案,官方文档上也有注明,并且有专门的篇幅阐述在不同的硬件平台下如何创建分区:

注​记​

如​果​你​还​没​有​计​划​怎​么​设​置​分​区​,你​可​以​参​考 第 25 章 磁​盘​分​区​简​介第 4.18.4 节 “推​荐​的​分​区​方​案​”。 ​至​少​,你​ 需​要​一​个​大​小​合​适​的​根​分​区​和​两​倍​于​系​统​物​理​内​存​的​交​换​分​区​。​Itanium 系​统​的​用​户​应​该​有​一​个​大​约 100 MB 的 FAT (VFAT) 格​式​的 /boot/efi/ 分​区​、​至​少 512 MB 的​交​换​分​区​和​大​小​合​适​的​根​分​区​(/)。
根据这些建议,针对 x86、​AMD64 和 Intel® 64 位​系​统架构 的服务器,我们应该创建至少创建如下分区:
  • 交换分区,内存在 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.
由此就创建了一个 radmin 用户和一个对应的 radmin 组,并设置了 radmin 用户的密码。而 -G 参数是把 radmin 用户加入 wheel 管理员组。
默认情况下,任何用户都可以 su 到 root 用户,我们们现在就来做个限制,只允许 wheel 组内的用户才可以 su 到 root用户。编辑 su 的 PAM 配置文件 (/etc/pam.d/su),找到下面这行,把前面的注释 # 去掉:
auth            required        pam_wheel.so use_uid
这个改变意味着只有 wheel 组的成员才可以使用 su 这个命令。所以,wheel 组内的用户,包括 radmin,能够 su 到任何用户,包括 su 到 root。但这样存在个副作用,就是其他组的用户将完全无法使用这个命令,即使是想 su 到 root 以外的用户。不过作为服务器而言,我们平时也就是一个管理员做一些专门的维护,不太会有大量普通用户帐户的需求。

配置 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
然后请重新引导 sshd 服务:
# service sshd restart
SSH 支持 TCP wrappers,因此服务的访问权限也可同时用 hosts.allow 及 hosts.deny 来进行控制:
# echo "sshd:ALL" >> /etc/hosts.deny
# echo "sshd:10." >> /etc/hosts.allow
现在,只有 10.*.*.* 的地址才可以连接服务器的 SSH 服务。当然,如果管理员的办公地址固定,可以设置成某个具体的 IP 地址。
这样一来,如果给 radmin 设置足够强壮的密码,并且做到不定期更换,通过 SSH 客户端登录服务器已经足够安全了。当然,如果非常在意安全性,还有个增强安全的手段,就是采用公钥/私钥来验证。
SSH 客户端有很多,比如收费的 SecureCRT、免费的 PuTTY, 它们都有生成公钥 / 密钥对的功能。用它们的这个功能生成 SSH-2 RSA Key,然后分别保存公钥和密钥,密钥放置在软件规定的目录,而公钥需要上传至服务器上。假设公钥文件名为 id_rsa.pub,已经传至 radmin 的 home 目录,现在以 radmin 用户登录服务器,然后做以下操作:
如果没有 .ssh 目录,则先创建:
$ mkdir ~/.ssh
安装公钥到 authorized_keys 清单内:
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
上一步成功输入了公钥后,删除原公钥文件:
$ rm -f id_rsa.pub
最后,设置服务器上的文件权限:
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
今后就能用公钥 / 密钥对的方式登录 SSH 服务器了,如果以后只希望以这种方式登录服务器,可以在 /etc/ssh/sshd_config 配置文件中禁用掉口令登录:
# 停用口令验证,强制使用公钥 / 密钥对
PasswordAuthentication no

收窄个别挂载点的权限

官方中文 Wiki 里这么说:
当你将分区划分好及设置尺寸后,你便可以尽量收窄个别挂载点的权限。只要情况容许,你便应该加入 nodev、nodexec 及 nosuid。下面是一个已经适切地收窄权限的 /etc/fstab 样例档:
/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
明显地,你需要修改这个样例来迎合你的系统。LVM、扇区名称、标签等都可以被更改。请不要只字不漏地复制这个样例档,并期望它适合你使用。
网页服务器的挂载亦可以被设置为 noexec,但这样做会影响到 cgi 类应用程序,与及依赖 execute bit hack 的服务器端包含档。如果你不会应用 cgi 程序,我推荐最低限度测试采用 noexec,并看看会否有副作用。
也就是说,我们应该根据我们的实际情况,尽量给一些挂载点加入 nodev、nodexec 及 nosuid,限制这些 dev、exec、suid 的功能属性,而达到收窄权限、增强安全的目的。

限制 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
  • 执行 /sbin/chkconfig ip6tables off 来停用 IPv6 防火墙
  • 重新引导系统
另类做法(可能较容易,并适用于在任何有 /etc/modprobe.d 的发行内):
# 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
完成安装后会创建 cron 脚本来自动执行自动更新的任务,任务的配置文件是 /etc/yum/yum-updatesd.conf。默认值是定期检查然后通知 root,而不自动更新,可以通过配置文件调整。
另外,官方 Wiki 的 这篇文档 里提供了另一种方法,直接创建了几个脚本放在系统对应目录中,号称他这个脚本相对占用较少资源。如果用他这个方法的话,记得创建好 /etc/cron.daily/yum.cron 文件后,增加执行属性:
# chmod +x /etc/cron.daily/yum.cron

利用 ntpd 同步时间

一般来说,让服务器一直保持标准时间是很重要的。做到这一点,明显要用到 NTP 服务。而从网络上同步标准时间有两个做法,一个是 ntpdate 命令,一个是 ntpd 守护进程。ntpdate 命令同步时间是立即生效的,不管本地时间和标准时间是不是差得离谱。命令的用法也很简单,如下即可:
# ntpdate cn.pool.ntp.org
上面的 cn.pool.ntp.org 是公用网络时间服务器集群在中国的地址池,更多的地址池可以在 这里(http://www.pool.ntp.org) 找到。
对于一个长时间开机的服务器来说,通过 ntpd 守护进程来同步时间是一个更好的办法。它根据本地时间和标准时间之间的漂移量,让本地时间慢慢的调整到标准时间,这样就不会影响一些对时间敏感的程序的运 行,而且不再需要管理员去手动运行命令。但是它有个限制,当本地时间和标准时间差别太大的时候,它会报错,不允许调整。这时就要先用 ntpdate 手动同步一下时间,然后再启用 ntpd 进程。
ntp 组件在 CenOS 5 操作系统安装的时候已经装好,如果没有的话可以通过下面的命令安装:
# yum -y install ntp
ntpd 的配置文件是 /etc/ntp.conf,默认配置已经完全满足我们的要求,指定了一组网络时间服务器,允许本机向这些源发请求,不接受请求(不对外提供服务)。我们要做的仅仅是更改一下配置文件中的网络时间服务器地址。根据 NTP POOL PROJECT 提供的 中国地区的服务器集群(NTP Servers in China, cn.pool.ntp.org) 地址信息,把 /etc/ntp.conf 中的默认地址换成下面的地址:
# 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
ntpd 默认没有自动启动,首先通过下面的命令启动 ntpd 守护进程:
# 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
最后要令 ntpd 开机自动启动,通过下面的命令完成:
# chkconfig ntpd on

停止无用服务(守护进程)

CentOS 默认开机自动启动的守护进程中,可能有一些对于我们针对某些单独应用的服务器不是必需的,所以我们要根据实际情况停用一些守护进程。进行这一操作的是 chkconfig 命令。chkconfig 命令的用法很简单:
usage:   chkconfig --list [name]
         chkconfig --add 
         chkconfig --del 
         chkconfig [--level ]  
另外还有一个文字界面下的图形操作方式,是通过 ntsysv 命令实现的:
# ntsysv

非正常关机的自动磁盘修复配置

如果由于种种原因,服务器非正常关机了,比如死机、强制关机或复位、突然断电等,如果有正在打开的文件,很可能发生文件系统的一些错误,检查文件系 统并修复错误的命令是著名的 fsck。通过创建 /etc/sysconfig/autofsck 文件,设置如下内容,能够在非正常关机后,系统启动时自动运行 fsck 命令来检查并修复文件系统错误:
# 启动自动检查的功能
AUTOFSCK_DEF_CHECK=yes
# 对所有的提示都回答 yes
PROMPT=yes

还有很多要做的……

根据我今后的管理和学习的积累,会随时把一些内容记录下来……

No comments: