标签 RHCE 下的文章

网络时间协议 - NTP - 是运行在传输层 123 号端口的 UDP 协议,它允许计算机通过网络同步准确时间。随着时间的流逝,计算机内部时间会出现漂移,这会导致时间不一致问题,尤其是对于服务器和客户端日志文件,或者你想要复制服务器的资源或数据库。

在 CentOS 上安装 NTP 服务器

在 CentOS 和 RHEL 7 上安装 NTP 服务器

前置要求:

额外要求:

这篇指南会告诉你如何在 CentOS/RHCE 7 上安装和配置 NTP 服务器,并使用 NTP 公共时间服务器池 NTP Public Pool Time Servers 列表中和你服务器地理位置最近的可用节点中同步时间。

步骤一:安装和配置 NTP 守护进程

1、 官方 CentOS /RHEL 7 库默认提供 NTP 服务器安装包,可以通过使用下面的命令安装。

# yum install ntp

在 CentOS 上安装 NTP 服务器

安装 NTP 服务器

2、 安装完服务器之后,首先到官方 NTP 公共时间服务器池 NTP Public Pool Time Servers ,选择你服务器物理位置所在的洲,然后搜索你的国家位置,然后会出现 NTP 服务器列表。

NTP 服务器池

NTP 服务器池

3、 然后打开编辑 NTP 守护进程的主配置文件,注释掉来自 pool.ntp.org 项目的公共服务器默认列表,并用类似下面截图中提供给你所在国家的列表替换。(LCTT 译注:中国使用 0.cn.pool.ntp.org 等)

在 CentOS 中配置 NTP 服务器

配置 NTP 服务器

4、 下一步,你需要允许来自你的网络的客户端和这台服务器同步时间。为了做到这点,添加下面一行到 NTP 配置文件,其中 restrict 语句控制允许哪些网络查询和同步时间 - 请根据需要替换网络 IP。

restrict 192.168.1.0 netmask 255.255.255.0 nomodify notrap

nomodify notrap 语句意味着不允许你的客户端配置服务器或者作为同步时间的节点。

5、 如果你需要用于错误处理的额外信息,以防你的 NTP 守护进程出现问题,添加一个 logfile 语句,用于记录所有 NTP 服务器问题到一个指定的日志文件。

logfile /var/log/ntp.log

在 CentOS 中启用 NTP 日志

启用 NTP 日志

6、 在你编辑完所有上面解释的配置并保存关闭 ntp.conf 文件后,你最终的配置看起来像下面的截图。

CentOS 中 NTP 服务器的配置

NTP 服务器配置

步骤二:添加防火墙规则并启动 NTP 守护进程

7、 NTP 服务使用 OSI 传输层(第四层)的 123 号 UDP 端口。它是为了避免可变延迟的影响所特别设计的。要在 RHEL/CentOS 7 中开放这个端口,可以对 Firewalld 服务使用下面的命令。

# firewall-cmd --add-service=ntp --permanent
# firewall-cmd --reload

在 Firewall 中开放 NTP 端口

在 Firewall 中开放 NTP 端口

8、 你在防火墙中开放了 123 号端口之后,启动 NTP 服务器并确保系统范围内可用。用下面的命令管理服务。

# systemctl start ntpd
# systemctl enable ntpd
# systemctl status ntpd

启动 NTP 服务

启动 NTP 服务

步骤三:验证服务器时间同步

9、 启动了 NTP 守护进程后,用几分钟等服务器和它的服务器池列表同步时间,然后运行下面的命令验证 NTP 节点同步状态和你的系统时间。

# ntpq -p
# date -R

验证 NTP 服务器时间

验证 NTP 时间同步

10、 如果你想查询或者和你选择的服务器池同步,你可以使用 ntpdate 命令,后面跟服务器名或服务器地址,类似下面建议的命令行示例。

# ntpdate -q  0.ro.pool.ntp.org  1.ro.pool.ntp.org

同步 NTP 同步

同步 NTP 时间

步骤四:设置 Windows NTP 客户端

11、 如果你的 windows 机器不是域名控制器的一部分,你可以配置 Windows 和你的 NTP服务器同步时间。在任务栏右边 -> 时间 -> 更改日期和时间设置 -> 网络时间标签 -> 更改设置 -> 和一个网络时间服务器检查同步 -> 在 Server 空格输入服务器 IP 或 FQDN -> 马上更新 -> OK。

和 NTP 同步 Windows 时间

和 NTP 同步 Windows 时间

就是这些。在你的网络中配置一个本地 NTP 服务器能确保你所有的服务器和客户端有相同的时间设置,以防出现网络连接失败,并且它们彼此都相互同步。


via: http://www.tecmint.com/install-ntp-server-in-centos/

作者:Matei Cezar 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

尽管现在有很多在线联系方式,电子邮件仍然是一个人传递信息给远在世界尽头或办公室里坐在我们旁边的另一个人的有效方式。

下面的图描述了电子邮件从发送者发出直到信息到达接收者收件箱的传递过程。

电子邮件如何工作

电子邮件如何工作

要实现这一切,背后发生了好多事情。为了使电子邮件信息从一个客户端应用程序(例如 Thunderbird、Outlook,或者 web 邮件服务,例如 Gmail 或 Yahoo 邮件)投递到一个邮件服务器,并从其投递到目标服务器并最终到目标接收人,每个服务器上都必须有 SMTP(简单邮件传输协议)服务。

这就是为什么我们要在这篇博文中介绍如何在 RHEL 7 中设置 SMTP 服务器,从本地用户发送的邮件(甚至发送到另外一个本地用户)被 转发 forward 到一个中央邮件服务器以便于访问。

在这个考试的要求中这称为 无客户端 null-client 安装。

在我们的测试环境中将包括一个 起源 originating 邮件服务器和一个中央服务器或 中继主机 relayhost

  • 起源邮件服务器: (主机名: box1.mydomain.com / IP: 192.168.0.18)
  • 中央邮件服务器: (主机名: mail.mydomain.com / IP: 192.168.0.20)

我们在两台机器中都会使用你熟知的 /etc/hosts 文件做名字解析:

192.168.0.18    box1.mydomain.com       box1
192.168.0.20    mail.mydomain.com       mail

安装 Postfix 和防火墙/SELinux 注意事项

首先,我们需要(在两台机器上):

1、 安装 Postfix:

# yum update && yum install postfix

2、 启动服务并启用开机自动启动:

# systemctl start postfix
# systemctl enable postfix

3、 允许邮件流量通过防火墙:

# firewall-cmd --permanent --add-service=smtp
# firewall-cmd --add-service=smtp

在防火墙中开通邮件服务器端口

在防火墙中开通邮件服务器端口

4、 在 box1.mydomain.com 配置 Postfix

Postfix 的主要配置文件是 /etc/postfix/main.cf。这个文件本身是一个很大的文本文件,因为其中包含了解释程序设置的用途的注释。

为了简洁,我们只显示了需要编辑的行(没错,在起源服务器中你需要保留 mydestination 为空;否则邮件会被存储到本地,而不是我们实际想要发往的中央邮件服务器):

myhostname = box1.mydomain.com
mydomain = mydomain.com
myorigin = $mydomain
inet_interfaces = loopback-only
mydestination =
relayhost = 192.168.0.20

5、 在 mail.mydomain.com 配置 Postfix

myhostname = mail.mydomain.com
mydomain = mydomain.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 192.168.0.0/24, 127.0.0.0/8

如果还没有设置,还要设置相关的 SELinux 布尔值永久为真:

# setsebool -P allow_postfix_local_write_mail_spool on

设置 Postfix SELinux 权限

设置 Postfix SELinux 权限

上面的 SELinux 布尔值会允许中央服务器上的 Postfix 可以写入 邮件池 mail spool

6、 在两台机子上重启服务以使更改生效:

# systemctl restart postfix

如果 Postfix 没有正确启动,你可以使用下面的命令进行错误处理。

# systemctl -l status postfix
# journalctl -xn
# postconf -n

测试 Postfix 邮件服务

要测试邮件服务器,你可以使用任何 邮件用户代理 Mail User Agent,MUA ,例如 mail 或 mutt

由于我个人喜欢 mutt,我会在 box1 中使用它发送邮件给用户 tecmint,并把现有文件(mailbody.txt)作为信息内容:

# mutt -s "Part 9-RHCE series" [email protected] < mailbody.txt

测试 Postfix 邮件服务器

测试 Postfix 邮件服务器

现在到中央邮件服务器(mail.mydomain.com)以 tecmint 用户登录,并检查是否收到了邮件:

# su – tecmint
# mail

检查 Postfix 邮件服务器发送

检查 Postfix 邮件服务器发送

如果没有收到邮件,检查 root 用户的邮件池看看是否有警告或者错误提示。你也许需要使用 nmap 命令确保两台服务器运行了 SMTP 服务,并在中央邮件服务器中打开了 25 号端口:

# nmap -PN 192.168.0.20

Postfix 邮件服务器错误处理

Postfix 邮件服务器错误处理

总结

像本文中展示的设置邮件服务器和中继主机是每个系统管理员必须拥有的重要技能,也代表了理解和安装更复杂情景的基础,例如一个邮件服务器托管有多个邮件账户(甚至成百上千)的域名。

(请注意这种类型的设置需要有 DNS 服务器,这不在本文的介绍范围),但你可以参照下面的文章设置 DNS 服务器:

最后,我强烈建议你熟悉 Postfix 的配置文件(main.cf)和这个程序的帮助手册。如果有任何疑问,别犹豫,使用下面的评论框或者我们的论坛 Linuxsay.com 告诉我们吧,你会从世界各地的 Linux 高手中获得几乎是及时的帮助。


via: http://www.tecmint.com/setup-postfix-mail-server-smtp-using-null-client-on-centos/

作者:Gabriel Cánepa 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你是一个负责维护和确保 web 服务器安全的系统管理员,你需要花费最大的精力确保服务器中处理和通过的数据任何时候都受到保护。

使用 SSL/TLS 设置 Apache HTTPS

RHCE 系列:第八部分 - 使用网络安全服务(NSS)为 Apache 通过 TLS 实现 HTTPS

为了在客户端和服务器之间提供更安全的连接,作为 HTTP 和 SSL( Secure Sockets Layer 安全套接层 )或者最近称为 TLS( Transport Layer Security 传输层安全 )的组合,产生了 HTTPS 协议。

由于一些严重的安全漏洞,SSL 已经被更健壮的 TLS 替代。由于这个原因,在这篇文章中我们会解析如何通过 TLS 实现你 web 服务器和客户端之间的安全连接。

这里假设你已经安装并配置好了 Apache web 服务器。如果还没有,在进入下一步之前请阅读下面站点中的文章。

安装 OpenSSL 和一些工具包

首先,确保正在运行 Apache 并且允许 http 和 https 通过防火墙:

# systemctl start http
# systemctl enable http
# firewall-cmd --permanent –-add-service=http
# firewall-cmd --permanent –-add-service=https

然后安装一些必需的软件包:

# yum update && yum install openssl mod_nss crypto-utils

重要:请注意如果你想使用 OpenSSL 库而不是 NSS( Network Security Service 网络安全服务 )实现 TLS,你可以在上面的命令中用 mod\_ssl 替换 mod\_nss(使用哪一个取决于你,但在这篇文章中我们会使用 NSS,因为它更加安全,比如说,它支持最新的加密标准,比如 PKCS #11)。

如果你使用 mod\_nss,首先要卸载 mod\_ssl,反之如此。

# yum remove mod_ssl

配置 NSS(网络安全服务)

安装完 mod\_nss 之后,会创建默认的配置文件 /etc/httpd/conf.d/nss.conf。你应该确保所有 Listen 和 VirualHost 指令都指向 443 号端口(HTTPS 默认端口):

nss.conf – 配置文件


Listen 443
VirtualHost _default_:443

然后重启 Apache 并检查是否加载了 mod\_nss 模块:

# apachectl restart
# httpd -M | grep nss

在 Apache 中检查 mod_nss 模块

检查 Apache 是否加载 mod\_nss 模块

下一步,在 /etc/httpd/conf.d/nss.conf 配置文件中做以下更改:

1、 指定 NSS 数据库目录。你可以使用默认的目录或者新建一个。本文中我们使用默认的:

NSSCertificateDatabase /etc/httpd/alias

2、 通过保存密码到数据库目录中的 /etc/httpd/nss-db-password.conf 文件来避免每次系统启动时要手动输入密码:

NSSPassPhraseDialog file:/etc/httpd/nss-db-password.conf

其中 /etc/httpd/nss-db-password.conf 只包含以下一行,其中 mypassword 是后面你为 NSS 数据库设置的密码:

internal:mypassword

另外,要设置该文件的权限和属主为 0640 和 root:apache:

# chmod 640 /etc/httpd/nss-db-password.conf
# chgrp apache /etc/httpd/nss-db-password.conf

3、 由于 POODLE SSLv3 漏洞,红帽建议停用 SSL 和 TLSv1.0 之前所有版本的 TLS(更多信息可以查看这里)。

确保 NSSProtocol 指令的每个实例都类似下面一样(如果你没有托管其它虚拟主机,很可能只有一条):

NSSProtocol TLSv1.0,TLSv1.1

4、 由于这是一个自签名证书,Apache 会拒绝重启,并不会识别为有效发行人。由于这个原因,对于这种特殊情况我们还需要添加:

NSSEnforceValidCerts off

5、 虽然并不是严格要求,为 NSS 数据库设置一个密码同样很重要:

# certutil -W -d /etc/httpd/alias

为 NSS 数据库设置密码

为 NSS 数据库设置密码

创建一个 Apache SSL 自签名证书

下一步,我们会创建一个自签名证书来让我们的客户机可以识别服务器(请注意这个方法对于生产环境并不是最好的选择;对于生产环境你应该考虑购买第三方可信证书机构验证的证书,例如 DigiCert)。

我们用 genkey 命令为 box1 创建有效期为 365 天的 NSS 兼容证书。完成这一步后:

# genkey --nss --days 365 box1

选择 Next:

创建 Apache SSL 密钥

创建 Apache SSL 密钥

你可以使用默认的密钥大小(2048),然后再次选择 Next:

选择 Apache SSL 密钥大小

选择 Apache SSL 密钥大小

等待系统生成随机比特:

生成随机密钥比特

生成随机密钥比特

为了加快速度,会提示你在控制台输入随机字符,正如下面的截图所示。请注意当没有从键盘接收到输入时进度条是如何停止的。然后,会让你选择:

  1. 是否发送验证签名请求(CSR)到一个验证机构(CA):选择 No,因为这是一个自签名证书。
  2. 为证书输入信息。

最后,会提示你输入之前给 NSS 证书设置的密码:

# genkey --nss --days 365 box1

Apache NSS 证书密码

Apache NSS 证书密码

需要的话,你可以用以下命令列出现有的证书:

# certutil –L –d /etc/httpd/alias

列出 Apache NSS 证书

列出 Apache NSS 证书

然后通过名字删除(如果你真的需要删除的,用你自己的证书名称替换 box1):

# certutil -d /etc/httpd/alias -D -n "box1"

如果你需要继续进行的话,请继续阅读。

测试 Apache SSL HTTPS 连接

最后,是时候测试到我们服务器的安全连接了。当你用浏览器打开 https://,你会看到著名的信息 “This connection is untrusted”:

检查 Apache SSL 连接

检查 Apache SSL 连接

在上面的情况中,你可以点击 添加例外 Add Exception 然后 确认安全例外 Confirm Security Exception - 但先不要这么做。让我们首先来看看证书看它的信息是否和我们之前输入的相符(如截图所示)。

要做到这点,点击上面的 视图 View... -> 详情 Details 选项卡,当你从列表中选择发行人你应该看到这个:

确认 Apache SSL 证书详情

确认 Apache SSL 证书详情

现在你可以继续,确认例外(限于此次或永久),然后会通过 https 把你带到你 web 服务器的 DocumentRoot 目录,在这里你可以使用你浏览器自带的开发者工具检查连接详情:

在火狐浏览器中,你可以通过在屏幕中右击,然后从上下文菜单中选择 检查元素 Inspect Element 启动开发者工具,尤其要看“ 网络 Network ”选项卡:

检查 Apache HTTPS 连接

检查 Apache HTTPS 连接

请注意这和之前显示的在验证过程中输入的信息一致。还有一种方式通过使用命令行工具测试连接:

左图(测试 SSLv3):

# openssl s_client -connect localhost:443 -ssl3

右图(测试 TLS):

# openssl s_client -connect localhost:443 -tls1

测试 Apache SSL 和 TLS 连接

测试 Apache SSL 和 TLS 连接

参考上面的截图了解更详细信息。

总结

我想你已经知道,使用 HTTPS 会增加会在你站点中输入个人信息的访客的信任(从用户名和密码到任何商业/银行账户信息)。

在那种情况下,你会希望获得由可信验证机构签名的证书,正如我们之前解释的(步骤和设置需要启用例外的证书的步骤相同,发送 CSR 到 CA 然后获得返回的签名证书);否则,就像我们的例子中一样使用自签名证书即可。

要获取更多关于使用 NSS 的详情,可以参考关于 mod-nss 的在线帮助。如果你有任何疑问或评论,请告诉我们。


via: http://www.tecmint.com/create-apache-https-self-signed-certificate-using-nss/

作者:Gabriel Cánepa 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在本系列的前一篇文章,我们回顾了如何在可能包括多种类型操作系统的网络上配置 Samba 共享。现在,如果你需要为一组类 Unix 客户端配置文件共享,很自然的你会想到网络文件系统,或简称 NFS。

设置使用 Kerberos 进行身份验证的 NFS 服务器

RHCE 系列:第七部分 - 设置使用 Kerberos 进行身份验证的 NFS 服务器

在这篇文章中我们会介绍配置基于 Kerberos 身份验证的 NFS 共享的整个流程。假设你已经配置好了一个 NFS 服务器和一个客户端。如果还没有,可以参考 安装和配置 NFS 服务器 - 它列出了需要安装的依赖软件包并解释了在进行下一步之前如何在服务器上进行初始化配置。

另外,你可能还需要配置 SELinuxfirewalld 以允许通过 NFS 进行文件共享。

下面的例子假设你的 NFS 共享目录在 box2 的 /nfs:

# semanage fcontext -a -t public_content_rw_t "/nfs(/.*)?"
# restorecon -R /nfs
# setsebool -P nfs_export_all_rw on
# setsebool -P nfs_export_all_ro on

(其中 -P 标记指示重启持久有效)。

最后,别忘了:

创建 NFS 组并配置 NFS 共享目录

1、 新建一个名为 nfs 的组并给它添加用户 nfsnobody,然后更改 /nfs 目录的权限为 0770,组属主为 nfs。于是,nfsnobody(对应请求用户)在共享目录有写的权限,你就不需要在 /etc/exports 文件中使用 norootsquash(LCTT 译注:设为 root\_squash 意味着在访问 NFS 服务器上的文件时,客户机上的 root 用户不会被当作 root 用户来对待)。

# groupadd nfs
# usermod -a -G nfs nfsnobody
# chmod 0770 /nfs
# chgrp nfs /nfs

2、 像下面那样更改 export 文件(/etc/exports)只允许从 box1 使用 Kerberos 安全验证的访问(sec=krb5)。

注意:anongid 的值设置为之前新建的组 nfs 的 GID:

exports – 添加 NFS 共享

/nfs box1(rw,sec=krb5,anongid=1004)

3、 再次 exprot(-r)所有(-a)NFS 共享。为输出添加详情(-v)是个好主意,因为它提供了发生错误时解决问题的有用信息:

# exportfs -arv

4、 重启并启用 NFS 服务器以及相关服务。注意你不需要启动 nfs-lock 和 nfs-idmapd,因为系统启动时其它服务会自动启动它们:

# systemctl restart rpcbind nfs-server nfs-lock nfs-idmap
# systemctl enable rpcbind nfs-server

测试环境和其它前提要求

在这篇指南中我们使用下面的测试环境:

  • 客户端机器 [box1: 192.168.0.18]
  • NFS / Kerberos 服务器 [box2: 192.168.0.20] (也称为密钥分发中心,简称 KDC)。

注意:Kerberos 服务是至关重要的认证方案。

正如你看到的,为了简便,NFS 服务器和 KDC 在同一台机器上,当然如果你有更多可用机器你也可以把它们安装在不同的机器上。两台机器都在 mydomain.com 域。

最后同样重要的是,Kerberos 要求客户端和服务器中至少有一个域名解析的基本方式和网络时间协议服务,因为 Kerberos 身份验证的安全一部分基于时间戳。

为了配置域名解析,我们在客户端和服务器中编辑 /etc/hosts 文件:

host 文件 – 为域添加 DNS

192.168.0.18    box1.mydomain.com    box1
192.168.0.20    box2.mydomain.com    box2

在 RHEL 7 中,chrony 是用于 NTP 同步的默认软件:

# yum install chrony
# systemctl start chronyd
# systemctl enable chronyd

为了确保 chrony 确实在和时间服务器同步你系统的时间,你可能要输入下面的命令两到三次,确保时间偏差尽可能接近 0:

# chronyc tracking

用 Chrony 同步服务器时间

用 Chrony 同步服务器时间

安装和配置 Kerberos

要设置 KDC,首先在客户端和服务器安装下面的软件包(客户端不需要 server 软件包):

# yum update && yum install krb5-server krb5-workstation pam_krb5

安装完成后,编辑配置文件(/etc/krb5.conf 和 /var/kerberos/krb5kdc/kadm5.acl),像下面那样用 mydomain.com 替换所有 example.com。

下一步,确保 Kerberos 能功过防火墙并启动/启用相关服务。

重要:客户端也必须启动和启用 nfs-secure:

# firewall-cmd --permanent --add-service=kerberos
# systemctl start krb5kdc kadmin nfs-secure   
# systemctl enable krb5kdc kadmin nfs-secure       

现在创建 Kerberos 数据库(请注意这可能会需要一点时间,因为它会和你的系统进行多次交互)。为了加速这个过程,我打开了另一个终端并运行了 ping -f localhost 30 到 45 秒):

# kdb5_util create -s

创建 Kerberos 数据库

创建 Kerberos 数据库

下一步,使用 kadmin.local 工具为 root 创建管理权限:

# kadmin.local
# addprinc root/admin

添加 Kerberos 服务器到数据库:

# addprinc -randkey host/box2.mydomain.com

在客户端(box1)和服务器(box2)上对 NFS 服务同样操作。请注意下面的截图中在退出前我忘了在 box1 上进行操作:

# addprinc -randkey nfs/box2.mydomain.com
# addprinc -randkey nfs/box1.mydomain.com

输入 quit 和回车键退出:

添加 Kerberos 到 NFS 服务器

添加 Kerberos 到 NFS 服务器

为 root/admin 获取和缓存 票据授权票据 ticket-granting ticket

# kinit root/admin
# klist

缓存 Kerberos

缓存 Kerberos

真正使用 Kerberos 之前的最后一步是保存被授权使用 Kerberos 身份验证的规则到一个密钥表文件(在服务器中):

# kdadmin.local
# ktadd host/box2.mydomain.com
# ktadd nfs/box2.mydomain.com
# ktadd nfs/box1.mydomain.com

最后,挂载共享目录并进行一个写测试:

# mount -t nfs4 -o sec=krb5 box2:/nfs /mnt
# echo "Hello from Tecmint.com" > /mnt/greeting.txt

挂载 NFS 共享

挂载 NFS 共享

现在让我们卸载共享,在客户端中重命名密钥表文件(模拟它不存在)然后试着再次挂载共享目录:

# umount /mnt
# mv /etc/krb5.keytab /etc/krb5.keytab.orig

挂载/卸载 Kerberos NFS 共享

挂载/卸载 Kerberos NFS 共享

现在你可以使用基于 Kerberos 身份验证的 NFS 共享了。

总结

在这篇文章中我们介绍了如何设置带 Kerberos 身份验证的 NFS。和我们在这篇指南中介绍的相比,该主题还有很多相关内容,可以在 Kerberos 手册 查看,另外至少可以说 Kerberos 有一点棘手,如果你在测试或实现中遇到了任何问题或需要帮助,别犹豫在下面的评论框中告诉我们吧。


via: http://www.tecmint.com/setting-up-nfs-server-with-kerberos-based-authentication/

作者:Gabriel Cánepa 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

为了确保你的 RHEL 7 系统安全,你需要通过查看日志文件来监控系统中发生的所有活动。这样,你就可以检测到任何不正常或有潜在破坏的活动并进行系统故障排除或者其它恰当的操作。

Linux 中使用 Rsyslog 和 Logrotate 轮换日志文件

RHCE 考试 - 第五部分:使用 Rsyslog 和 Logrotate 管理系统日志

在 RHEL 7 中,rsyslogd 守护进程负责系统日志,它从 /etc/rsyslog.conf(该文件指定所有系统日志的默认路径)和 /etc/rsyslog.d 中的所有文件(如果有的话)读取配置信息。

Rsyslogd 配置

快速浏览一下 rsyslog.conf 会是一个好的开端。该文件分为 3 个主要部分:模块(rsyslong 按照模块化设计),全局指令(用于设置 rsyslogd 守护进程的全局属性),以及规则。正如你可能猜想的,最后一个部分指示记录或显示什么以及在哪里保存(也称为 选择子 selector ),这也是这篇文章关注的重点。

rsyslog.conf 中典型的一行如下所示:

Rsyslogd 配置

Rsyslogd 配置

在上面的图片中,我们可以看到一个选择子包括了一个或多个用分号分隔的 “设备:优先级” Facility:Priority 对,其中设备描述了消息类型(参考 RFC 3164 4.1.1 章节,查看 rsyslog 可用的完整设备列表),优先级指示它的严重性,这可能是以下几种之一:

  • debug
  • info
  • notice
  • warning
  • err
  • crit
  • alert
  • emerg

尽管 none 并不是一个优先级,不过它意味着指定设备没有任何优先级。

注意:给定一个优先级表示该优先级以及之上的消息都应该记录到日志中。因此,上面例子中的行指示 rsyslogd 守护进程记录所有优先级为 info 以及以上(不管是什么设备)的除了属于 mail、authpriv、以及 cron 服务(不考虑来自这些设备的消息)的消息到 /var/log/messages。

你也可以使用逗号将多个设备分为一组,对同组中的设备使用相同的优先级。例如下面这行:

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

也可以这样写:

*.info;mail,authpriv,cron.none                /var/log/messages

换句话说,mail、authpriv 以及 cron 被分为一组,并使用关键字 none。

创建自定义日志文件

要把所有的守护进程消息记录到 /var/log/tecmint.log,我们需要在 rsyslog.conf 或者 /etc/rsyslog.d 目录中的单独文件(这样易于管理)添加下面一行:

daemon.*    /var/log/tecmint.log

然后重启守护进程(注意服务名称不以 d 结尾):

# systemctl restart rsyslog

在随便重启两个守护进程之前和之后查看下自定义日志的内容:

Linux 创建自定义日志文件

创建自定义日志文件

作为一个自学练习,我建议你重点关注设备和优先级,添加额外的消息到已有的日志文件或者像上面那样创建一个新的日志文件。

使用 Logrotate 轮换日志

为了防止日志文件无限制增长,logrotate 工具用于轮换、压缩、移除或者通过电子邮件发送日志,从而减轻管理会产生大量日志文件系统的困难。(译者注:日志轮换(rotate)是系统管理中归档每天产生的日志文件的自动化过程)

Logrotate 作为一个 cron 任务(/etc/cron.daily/logrotate)每天运行,并从 /etc/logrotate.conf 和 /etc/logrotate.d 中的文件(如果有的话)读取配置信息。

对于 rsyslog,即使你可以在主文件中为指定服务包含设置,为每个服务创建单独的配置文件能帮助你更好地组织设置。

让我们来看一个典型的 logrotate.conf:

Logrotate 配置

Logrotate 配置

在上面的例子中,logrotate 会为 /var/log/wtmp 进行以下操作:尝试每个月轮换一次,但至少文件要大于 1MB,然后用 0664 权限、用户 root、组 utmp 创建一个新的日志文件。下一步只保存一个归档日志,正如轮换指令指定的:

每月 Logrotate 日志

每月 Logrotate 日志

让我们再来看看 /etc/logrotate.d/httpd 中的另一个例子:

轮换 Apache 日志文件

轮换 Apache 日志文件

你可以在 logrotate 的 man 手册(man logrotateman logrotate.conf)中阅读更多有关它的设置。为了方便你的阅读,本文还提供了两篇文章的 PDF 格式。

作为一个系统工程师,很可能由你决定多久按照什么格式保存一次日志,这取决于你是否有一个单独的分区/逻辑卷给 /var。否则,你真的要考虑删除旧日志以节省存储空间。另一方面,根据你公司和客户内部的政策,为了以后的安全审核,你可能必须要保留多个日志。

保存日志到数据库

当然检查日志可能是一个很繁琐的工作(即使有类似 grep 工具和正则表达式的帮助)。因为这个原因,rsyslog 允许我们把它们导出到数据库(OTB 支持的关系数据库管理系统包括 MySQL、MariaDB、PostgreSQL 和 Oracle 等)。

指南的这部分假设你已经在要管理日志的 RHEL 7 上安装了 MariaDB 服务器和客户端:

# yum update && yum install mariadb mariadb-server mariadb-client rsyslog-mysql
# systemctl enable mariadb && systemctl start mariadb

然后使用 mysql_secure_installation 工具为 root 用户设置密码以及其它安全考量:

保证 MySQL 数据库安全

保证 MySQL 数据库安全

注意:如果你不想用 MariaDB root 用户插入日志消息到数据库,你也可以配置用另一个用户账户。如何实现的介绍已经超出了本文的范围,但在 MariaDB 知识 中有详细解析。为了简单在这篇指南中我们会使用 root 账户。

下一步,从 GitHub 下载 createDB.sql 脚本并导入到你的数据库服务器:

# mysql -u root -p < createDB.sql

保存服务器日志到数据库

保存服务器日志到数据库

最后,添加下面的行到 /etc/rsyslog.conf:

$ModLoad ommysql
$ActionOmmysqlServerPort 3306
*.* :ommysql:localhost,Syslog,root,YourPasswordHere

重启 rsyslog 和数据库服务器:

# systemctl restart rsyslog 
# systemctl restart mariadb

使用 SQL 语法查询日志

现在执行一些会改变日志的操作(例如停止和启动服务),然后登录到你的数据库服务器并使用标准的 SQL 命令显示和查询日志:

USE Syslog;
SELECT ReceivedAt, Message FROM SystemEvents;

在数据库中查询日志

在数据库中查询日志

总结

在这篇文章中我们介绍了如何设置系统日志,如果轮换日志以及为了简化查询如何重定向消息到数据库。我们希望这些技巧能对你准备 RHCE 考试 和日常工作有所帮助。

正如往常,非常欢迎你的反馈。用下面的表单和我们联系吧。


via: http://www.tecmint.com/manage-linux-system-logs-using-rsyslogd-and-logrotate/

作者:Gabriel Cánepa 译者:ictlyh 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

之前我听说高效的系统管理员的一个特点是懒惰。一开始看起来很矛盾,但作者接下来解释了其中的原因:

自动化 Linux 系统维护任务

RHCE 系列:第四部分 - 自动化 Linux 系统维护任务

如果一个系统管理员花费大量的时间解决问题以及做重复的工作,你就应该怀疑他这么做是否正确。换句话说,一个高效的系统管理员/工程师应该制定一个计划使得其尽量花费少的时间去做重复的工作,以及通过使用本系列中第三部分 使用 Linux 工具集监视系统活动报告 介绍的工具来预见问题。因此,尽管看起来他/她没有做很多的工作,但那是因为 shell 脚本帮助完成了他的/她的大部分任务,这也就是本章我们将要探讨的东西。

什么是 shell 脚本?

简单的说,shell 脚本就是一个由 shell 一步一步执行的程序,而 shell 是在 Linux 内核和最终用户之间提供接口的另一个程序。

默认情况下,RHEL 7 中用户使用的 shell 是 bash(/bin/bash)。如果你想知道详细的信息和历史背景,你可以查看这个维基页面

关于这个 shell 提供的众多功能的介绍,可以查看 man 手册,也可以从 (Bash 命令)处下载 PDF 格式。除此之外,假设你已经熟悉 Linux 命令(否则我强烈建议你首先看一下 Tecmint.com 中的文章 从新手到系统管理员指南 )。现在让我们开始吧。

写一个脚本显示系统信息

为了方便,首先让我们新建一个目录用于保存我们的 shell 脚本:

# mkdir scripts
# cd scripts

然后用喜欢的文本编辑器打开新的文本文件 system_info.sh。我们首先在头部插入一些注释以及一些命令:

#!/bin/bash

# RHCE 系列第四部分示例脚本
# 该脚本会返回以下这些系统信息:
# -主机名称:
echo -e "\e[31;43m***** HOSTNAME INFORMATION *****\e[0m"
hostnamectl
echo ""
# -文件系统磁盘空间使用:
echo -e "\e[31;43m***** FILE SYSTEM DISK SPACE USAGE *****\e[0m"
df -h
echo ""
# -系统空闲和使用中的内存:
echo -e "\e[31;43m ***** FREE AND USED MEMORY *****\e[0m"
free
echo ""
# -系统启动时间:
echo -e "\e[31;43m***** SYSTEM UPTIME AND LOAD *****\e[0m"
uptime
echo ""
# -登录的用户:
echo -e "\e[31;43m***** CURRENTLY LOGGED-IN USERS *****\e[0m"
who
echo ""
# -使用内存最多的 5 个进程
echo -e "\e[31;43m***** TOP 5 MEMORY-CONSUMING PROCESSES *****\e[0m"
ps -eo %mem,%cpu,comm --sort=-%mem | head -n 6
echo ""
echo -e "\e[1;32mDone.\e[0m"

然后,给脚本可执行权限:

# chmod +x system_info.sh

运行脚本:

./system_info.sh

注意为了更好的可视化效果各部分标题都用颜色显示:

服务器监视 Shell 脚本

服务器监视 Shell 脚本

颜色功能是由以下命令提供的:

echo -e "\e[COLOR1;COLOR2m<YOUR TEXT HERE>\e[0m"

其中 COLOR1 和 COLOR2 是前景色和背景色(Arch Linux Wiki 有更多的信息和选项解释), 是你想用颜色显示的字符串。

使任务自动化

你想使其自动化的任务可能因情况而不同。因此,我们不可能在一篇文章中覆盖所有可能的场景,但是我们会介绍使用 shell 脚本可以使其自动化的三种典型任务:

1) 更新本地文件数据库, 2) 查找(或者删除)有 777 权限的文件, 以及 3) 文件系统使用超过定义的阀值时发出警告。

让我们在脚本目录中新建一个名为 auto_tasks.sh 的文件并添加以下内容:

#!/bin/bash

# 自动化任务示例脚本:
# -更新本地文件数据库:
echo -e "\e[4;32mUPDATING LOCAL FILE DATABASE\e[0m"
updatedb
if [ $? == 0 ]; then
        echo "The local file database was updated correctly."
else
        echo "The local file database was not updated correctly."
fi
echo ""

# -查找 和/或 删除有 777 权限的文件。
echo -e "\e[4;32mLOOKING FOR FILES WITH 777 PERMISSIONS\e[0m"
# Enable either option (comment out the other line), but not both.
# Option 1: Delete files without prompting for confirmation. Assumes GNU version of find.
#find -type f -perm 0777 -delete
# Option 2: Ask for confirmation before deleting files. More portable across systems.
find -type f -perm 0777 -exec rm -i {} +;
echo ""
# -文件系统使用率超过定义的阀值时发出警告 
echo -e "\e[4;32mCHECKING FILE SYSTEM USAGE\e[0m"
THRESHOLD=30
while read line; do
        # This variable stores the file system path as a string
        FILESYSTEM=$(echo $line | awk '{print $1}')
        # This variable stores the use percentage (XX%)
        PERCENTAGE=$(echo $line | awk '{print $5}')
        # Use percentage without the % sign.
        USAGE=${PERCENTAGE%?}
        if [ $USAGE -gt $THRESHOLD ]; then
                echo "The remaining available space in $FILESYSTEM is critically low. Used: $PERCENTAGE"
        fi
done < <(df -h --total | grep -vi filesystem)

请注意该脚本最后一行两个 < 符号之间有个空格。

查找 777 权限文件的 Shell 脚本

查找 777 权限文件的 Shell 脚本

使用 Cron

想更进一步提高效率,你不会想只是坐在你的电脑前手动执行这些脚本。相反,你会使用 cron 来调度这些任务周期性地执行,并把结果通过邮件发动给预先指定的接收者,或者将它们保存到使用 web 浏览器可以查看的文件中。

下面的脚本(filesystem\_usage.sh)会运行有名的 df -h 命令,格式化输出到 HTML 表格并保存到 report.html 文件中:

#!/bin/bash
# 演示使用 shell 脚本创建 HTML 报告的示例脚本
# Web directory
WEB_DIR=/var/www/html
# A little CSS and table layout to make the report look a little nicer
echo "<HTML>
<HEAD>
<style>
.titulo{font-size: 1em; color: white; background:#0863CE; padding: 0.1em 0.2em;}
table
{
border-collapse:collapse;
}
table, td, th
{
border:1px solid black;
}
</style>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
</HEAD>
<BODY>" > $WEB_DIR/report.html
# View hostname and insert it at the top of the html body
HOST=$(hostname)
echo "Filesystem usage for host <strong>$HOST</strong><br>
Last updated: <strong>$(date)</strong><br><br>
<table border='1'>
<tr><th class='titulo'>Filesystem</td>
<th class='titulo'>Size</td>
<th class='titulo'>Use %</td>
</tr>" >> $WEB_DIR/report.html
# Read the output of df -h line by line
while read line; do
echo "<tr><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $1}' >> $WEB_DIR/report.html
echo "</td><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $2}' >> $WEB_DIR/report.html
echo "</td><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $5}' >> $WEB_DIR/report.html
echo "</td></tr>" >> $WEB_DIR/report.html
done < <(df -h | grep -vi filesystem)
echo "</table></BODY></HTML>" >> $WEB_DIR/report.html

在我们的 RHEL 7 服务器(192.168.0.18)中,看起来像下面这样:

服务器监视报告

服务器监视报告

你可以添加任何你想要的信息到那个报告中。添加下面的 crontab 条目在每天下午的 1:30 运行该脚本:

30 13 * * * /root/scripts/filesystem_usage.sh

总结

你很可能想起各种其他想要自动化的任务;正如你看到的,使用 shell 脚本能极大的简化任务。如果你觉得这篇文章对你有所帮助就告诉我们吧,别犹豫在下面的表格中添加你自己的想法或评论。


via: http://www.tecmint.com/using-shell-script-to-automate-linux-system-maintenance-tasks/

作者:Gabriel Cánepa 译者:ictlyh 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出