RHCSA 系列（十五）： 虚拟化基础和使用 KVM 进行虚拟机管理
假如你在词典中查一下单词 “ 虚拟化 （ virtualize ） ”，你将会发现它的意思是 “创造某些事物的一个虚拟物（而非真实的）”。在计算机行业中，术语 虚拟化 （ virtualization ） 指的是：在相同的物理（硬件）系统上，同时运行多个操作系统，且这几个系统相互隔离的可能性，而那个硬件在虚拟化架构中被称作 宿主机 （ host ） 。RHCSA 系列： 虚拟化基础和使用 KVM 进行虚拟机管理 – Part 15通过使用虚拟机监视器（也被称为 虚拟机管理程序 （ hypervisor ） ），虚拟机（被称为 guest）由底层的硬件来供给虚拟资源（举几个例子来说，如 CPU，RAM，存储介质，网络接口等）。考虑到这一点就可以清楚地看出，虚拟化的主要优点是节约成本（在设备和网络基础设施，及维护工作等方面）和显著地减少容纳所有必要硬件所需的物理空间。由于这个简单的指南不能涵盖所有的虚拟化方法，我鼓励你参考在总结部分中列出的文档，以此对这个话题做更深入的了解。请记住当前文章只是用于在 RHEL 7 中用命令行工具使用 KVM ( Kernel-based Virtual Machine （ 基于内核的虚拟机 ） ) 学习虚拟化基础知识的一个起点，而并不是对这个话题的深入探讨。检查硬件要求并安装软件包为了设置虚拟化，你的 CPU 必须能够支持它。你可以使用下面的命令来查看你的系统是否满足这个要求：# grep -E 'svm|vmx' /proc/cpuinfo 在下面的截图中，我们可以看到当前的系统（带有一个 AMD 的微处理器）支持虚拟化，svm 字样的存在暗示了这一点。假如我们有一个 Intel 系列的处理器，我们将会看到上面命令的结果将会出现 vmx 字样。检查 KVM 支持另外，你需要在你宿主机的硬件（BIOS 或 UEFI）中开启虚拟化。现在，安装必要的软件包：qemu-kvm 是一个开源的虚拟机程序，为 KVM 虚拟机监视器提供硬件仿真，而 qemu-img 则提供了一个操纵磁盘镜像的命令行工具。libvirt 包含与操作系统的虚拟化功能交互的工具。libvirt-python 包含一个模块，它允许用 Python 写的应用来使用由 libvirt 提供的接口。libguestfs-tools 包含各式各样的针对虚拟机的系统管理员命令行工具。virt-install 包含针对虚拟机管理的其他命令行工具。命令如下：# yum update && yum install qemu-kvm qemu-img libvirt libvirt-python libguestfs-tools virt-install 一旦安装完成，请确保你启动并开启了 libvirtd 服务：# systemctl start libvirtd.service # systemctl enable libvirtd.service 默认情况下，每个虚拟机将只能够与放在相同的物理服务器上的虚拟机以及宿主机自身通信。要使得虚拟机能够访问位于局域网或因特网中的其他机器，我们需要像下面这样在我们的宿主机上设置一个桥接接口（比如说 br0）：1、 添加下面的一行到我们的 NIC 主配置中（类似 /etc/sysconfig/network-scripts/ifcfg-enp0s3 这样的文件）：BRIDGE=br0 2、 使用下面的内容（注意，你可能需要更改 IP 地址，网关地址和 DNS 信息）为 br0 创建一个配置文件（/etc/sysconfig/network-scripts/ifcfg-br0）：DEVICE=br0 TYPE=Bridge BOOTPROTO=static IPADDR=192.168.0.18 NETMASK=255.255.255.0 GATEWAY=192.168.0.1 NM_CONTROLLED=no DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=br0 ONBOOT=yes DNS1=8.8.8.8 DNS2=8.8.4.4 3、 最后在文件/etc/sysctl.conf 中设置：net.ipv4.ip_forward = 1 来开启包转发并加载更改到当前的内核配置中：# sysctl -p 注意，你可能还需要告诉 firewalld 让这类的流量应当被允许通过防火墙。假如你需要这样做，记住你可以参考这个系列的 使用 firewalld 和 iptables 来控制网络流量。创建虚拟机镜像默认情况下，虚拟机镜像将会被创建到 /var/lib/libvirt/images 中，且强烈建议你不要更改这个设定，除非你真的需要那么做且知道你在做什么，并能自己处理有关 SELinux 的设定（这个话题已经超出了本教程的讨论范畴，但你可以参考这个系列的第 13 部分 使用 SELinux 来进行强制访问控制，假如你想更新你的知识的话）。这意味着你需要确保你在文件系统中分配了必要的空间来容纳你的虚拟机。下面的命令将使用位于 /home/gacanepa/ISOs目录下的 rhel-server-7.0-x86\_64-dvd.iso 镜像文件和 br0 这个网桥来创建一个名为 tecmint-virt01 的虚拟机，它有一个虚拟 CPU，1 GB（=1024 MB）的 RAM，20 GB 的磁盘空间（由/var/lib/libvirt/images/tecmint-virt01.img所代表）：# virt-install \ --network bridge=br0 --name tecmint-virt01 \ --ram=1024 \ --vcpus=1 \ --disk path=/var/lib/libvirt/images/tecmint-virt01.img,size=20 \ --graphics none \ --cdrom /home/gacanepa/ISOs/rhel-server-7.0-x86_64-dvd.iso --extra-args="console=tty0 console=ttyS0,115200" 假如安装文件位于一个 HTTP 服务器上，而不是存储在你磁盘中的镜像中，你必须将上面的 -cdrom 替换为 -location，并明确地指出在线存储仓库的地址。至于上面的 –graphics none 选项，它告诉安装程序只以文本模式执行安装过程。假如你使用一个 GUI 界面和一个 VNC 窗口来访问主虚拟机控制台，则可以省略这个选项。最后，使用 –extra-args 参数，我们将传递内核启动参数给安装程序，以此来设置一个串行的虚拟机控制台。现在，所安装的虚拟机应当可以作为一个正常的（真实的）服务来运行了。假如没有，请查看上面列出的步骤。管理虚拟机作为一个系统管理员，还有一些典型的管理任务需要你在虚拟机上去完成。注：下面所有的命令都需要在你的宿主机上运行：1. 列出所有的虚拟机：# virsh list --all 你必须留意上面命令输出中的虚拟机 ID（尽管上面的命令还会返回虚拟机的名称和当前的状态），因为你需要它来执行有关某个虚拟机的大多数管理任务。2. 显示某个虚拟机的信息：# virsh dominfo [VM Id] 3. 开启，重启或停止一个虚拟机操作系统：# virsh start | reboot | shutdown [VM Id] 4. 假如网络无法连接且在宿主机上没有运行 X 服务器，可以使用下面的命令来访问虚拟机的串行控制台：# virsh console [VM Id] 注：这需要你添加一个串行控制台配置信息到 /etc/grub.conf 文件中（参考刚才创建虚拟机时传递给-extra-args选项的参数）。5. 修改分配的内存或虚拟 CPU：首先，关闭虚拟机：# virsh shutdown [VM Id] 为 RAM 编辑虚拟机的配置：# virsh edit [VM Id] 然后更改<memory>[内存大小，注意不要加上方括号]</memory> 使用新的设定重启虚拟机：# virsh create /etc/libvirt/qemu/tecmint-virt01.xml 最后，可以使用下面的命令来动态地改变内存的大小：# virsh setmem [VM Id] [内存大小，这里没有括号] 对于 CPU，使用：# virsh edit [VM Id] 然后更改<cpu>[CPU 数目，这里没有括号]</cpu> 至于更深入的命令和细节，请参考 RHEL 5 虚拟化指南（这个指南尽管有些陈旧，但包括了用于管理虚拟机的 virsh 命令的详尽清单）的第 26 章里的表 26.1。总结在这篇文章中，我们涵盖了在 RHEL 7 中如何使用 KVM 和虚拟化的一些基本概念，这个话题是一个广泛且令人着迷的话题。并且我希望它能成为你在随后阅读官方的 RHEL 虚拟化入门 和 RHEL 虚拟化部署和管理指南 ，探索更高级的主题时的起点教程，并给你带来帮助。另外，为了分辨或拓展这里解释的某些概念，你还可以参考先前包含在 KVM 系列 中的文章。via: http://www.tecmint.com/kvm-virtualization-basics-and-guest-administration/作者：Gabriel Cánepa 译者：FSSlc 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
在这篇文章中，我们将首先罗列一些 LDAP 的基础知识（它是什么，它被用于何处以及为什么会被这样使用），然后向你展示如何使用 RHEL 7 系统来设置一个 LDAP 服务器以及配置一个客户端来使用它达到认证的目的。RHCSA 系列：设置 LDAP 服务器及客户端认证 – Part 14正如你将看到的那样，关于认证，还存在其他可能的应用场景，但在这篇指南中，我们将只关注基于 LDAP 的认证。另外，请记住，由于这个话题的广泛性，在这里我们将只涵盖它的基础知识，但你可以参考位于总结部分中列出的文档，以此来了解更加深入的细节。基于相同的原因，你将注意到：为了简洁起见，我已经决定省略了几个位于 man 页中 LDAP 工具的参考，但相应命令的解释是近在咫尺的（例如，输入 man ldapadd）。那还是让我们开始吧。我们的测试环境我们的测试环境包含两台 RHEL 7机器：Server: 192.168.0.18. FQDN: rhel7.mydomain.com Client: 192.168.0.20. FQDN: ldapclient.mydomain.com 如若你想，你可以使用在 RHCSA 系列（十二）: 使用 Kickstart 完成 RHEL 7 的自动化安装 中使用 Kickstart 安装的机子来作为客户端。LDAP 是什么？LDAP 代表 轻量级目录访问协议 （ Lightweight Directory Access Protocol ） ，并包含在一系列协议之中，这些协议允许一个客户端通过网络去获取集中存储的信息（例如所登录的 shell 的路径，家目录的绝对路径，或者其他典型的系统用户信息），而这些信息可以从不同的地方访问到或被很多终端用户获取到（另一个例子是含有某个公司所有雇员的家庭地址和电话号码的目录）。对于那些被赋予了权限可以使用这些信息的人来说，将这些信息进行集中管理意味着可以更容易地维护和获取。下面的图表提供了一个简化了的关于 LDAP 的示意图，在下面将会进行更多的描述：LDAP 示意图下面是对上面示意图的一个详细解释。在一个 LDAP 目录中，一个 条目 （ entry ） 代表一个独立单元或信息，被所谓的 区别名 （ DN，Distinguished Name ） 唯一识别。一个 属性 （ attribute ） 是一些与某个条目相关的信息（例如地址，有效的联系电话号码和邮箱地址）。每个属性被分配有一个或多个 值 （ value ） ，这些值被包含在一个以空格为分隔符的列表中。每个条目中那个唯一的值被称为一个 相对区别名 （ RDN，Relative Distinguished Name ） 。接下来，就让我们进入到有关服务器和客户端安装的内容。安装和配置一个 LDAP 服务器和客户端在 RHEL 7 中， LDAP 由 OpenLDAP 实现。为了安装服务器和客户端，分别使用下面的命令：# yum update && yum install openldap openldap-clients openldap-servers # yum update && yum install openldap openldap-clients nss-pam-ldapd 一旦安装完成，我们还需要关注一些事情。除非显示地提示，下面的步骤都只在服务器上执行：1. 在服务器和客户端上，为了确保 SELinux 不会妨碍挡道，长久地开启下列的布尔值：# setsebool -P allow_ypbind=0 authlogin_nsswitch_use_ldap=0 其中 allow_ypbind 为基于 LDAP 的认证所需要，而 authlogin_nsswitch_use_ldap则可能会被某些应用所需要。2. 开启并启动服务：# systemctl enable slapd.service # systemctl start slapd.service 记住你也可以使用 systemctl 来禁用，重启或停止服务：# systemctl disable slapd.service # systemctl restart slapd.service # systemctl stop slapd.service 3. 由于 slapd 服务是由 ldap 用户来运行的（你可以使用 ps -e -o pid,uname,comm | grep slapd 来验证），为了使得服务器能够更改由管理工具创建的条目，该用户应该有目录 /var/lib/ldap 的所有权，而这些管理工具仅可以由 root 用户来运行（紧接着有更多这方面的内容）。在递归地更改这个目录的所有权之前，将 slapd 的示例数据库配置文件复制进这个目录：# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG # chown -R ldap:ldap /var/lib/ldap 4. 设置一个 OpenLDAP 管理用户并设置密码：# slappasswd 正如下一幅图所展示的那样：设置 LDAP 管理密码然后以下面的内容创建一个 LDIF 文件(ldaprootpasswd.ldif)：dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}PASSWORD 其中：PASSWORD 是先前得到的经过哈希处理的字符串。cn=config 指的是全局配置选项。olcDatabase 指的是一个特定的数据库实例的名称，并且通常可以在 /etc/openldap/slapd.d/cn=config 目录中发现。根据上面提供的理论背景，ldaprootpasswd.ldif 文件将添加一个条目到 LDAP 目录中。在那个条目中，每一行代表一个属性键值对（其中 dn，changetype，add 和 olcRootPW 为属性，每个冒号右边的字符串为相应的键值）。随着我们的进一步深入，请记住上面的这些，并注意到在这篇文章的余下部分，我们使用相同的 通用名 （ Common Names ） (cn=)，而这些余下的步骤中的每一步都将与其上一步相关。5. 现在，通过特别指定相对于 ldap 服务的 URI ，添加相应的 LDAP 条目，其中只有 protocol/host/port 这几个域被允许使用。# ldapadd -H ldapi:/// -f ldaprootpasswd.ldif 上面命令的输出应该与下面的图像相似：LDAP 配置接着从 /etc/openldap/schema 目录导入一个基本的 LDAP 定义：# for def in cosine.ldif nis.ldif inetorgperson.ldif; do ldapadd -H ldapi:/// -f /etc/openldap/schema/$def; done LDAP 定义6. 让 LDAP 在它的数据库中使用你的域名。以下面的内容创建另一个 LDIF 文件，我们称之为 ldapdomain.ldif， 然后酌情替换这个文件中的域名（在 域名部分 （ Domain Component ） dc=） 和密码：dn: olcDatabase={1}monitor,cn=config changetype: modify replace: olcAccess olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=mydomain,dc=com" read by * none dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=mydomain,dc=com dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=Manager,dc=mydomain,dc=com dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}PASSWORD dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=mydomain,dc=com" write by anonymous auth by self write by * none olcAccess: {1}to dn.base="" by * read olcAccess: {2}to * by dn="cn=Manager,dc=mydomain,dc=com" write by * read 接着使用下面的命令来加载：# ldapmodify -H ldapi:/// -f ldapdomain.ldif LDAP 域名配置7. 现在，该是添加一些条目到我们的 LDAP 目录的时候了。在下面的文件中，属性和键值由一个冒号(:) 所分隔，这个文件我们将命名为 baseldapdomain.ldif:dn: dc=mydomain,dc=com objectClass: top objectClass: dcObject objectclass: organization o: mydomain com dc: mydomain dn: cn=Manager,dc=mydomain,dc=com objectClass: organizationalRole cn: Manager description: Directory Manager dn: ou=People,dc=mydomain,dc=com objectClass: organizationalUnit ou: People dn: ou=Group,dc=mydomain,dc=com objectClass: organizationalUnit ou: Group 添加条目到 LDAP 目录中：# ldapadd -x -D cn=Manager,dc=mydomain,dc=com -W -f baseldapdomain.ldif 添加 LDAP 域名，属性和键值8. 创建一个名为 ldapuser 的 LDAP 用户(adduser ldapuser)，然后在ldapgroup.ldif 中为一个 LDAP 组创建定义。# adduser ldapuser # vi ldapgroup.ldif 添加下面的内容：dn: cn=Manager,ou=Group,dc=mydomain,dc=com objectClass: top objectClass: posixGroup gidNumber: 1004 其中 gidNumber 是 ldapuser 在 /etc/group 中的 GID，然后加载这个文件：# ldapadd -x -W -D "cn=Manager,dc=mydomain,dc=com" -f ldapgroup.ldif 9. 为用户 ldapuser 添加一个带有定义的 LDIF 文件（ldapuser.ldif）：dn: uid=ldapuser,ou=People,dc=mydomain,dc=com objectClass: top objectClass: account objectClass: posixAccount objectClass: shadowAccount cn: ldapuser uid: ldapuser uidNumber: 1004 gidNumber: 1004 homeDirectory: /home/ldapuser userPassword: {SSHA}fiN0YqzbDuDI0Fpqq9UudWmjZQY28S3M loginShell: /bin/bash gecos: ldapuser shadowLastChange: 0 shadowMax: 0 shadowWarning: 0 并加载它：# ldapadd -x -D cn=Manager,dc=mydomain,dc=com -W -f ldapuser.ldif LDAP 用户配置相似地，你可以删除你刚刚创建的用户条目：# ldapdelete -x -W -D cn=Manager,dc=mydomain,dc=com "uid=ldapuser,ou=People,dc=mydomain,dc=com" 10. 允许有关 ldap 的通信通过防火墙：# firewall-cmd --add-service=ldap 11. 最后，但并非最不重要的是使用 LDAP 开启客户端的认证。为了在最后一步中对我们有所帮助，我们将使用 authconfig 工具（一个配置系统认证资源的界面）。使用下面的命令，在通过 LDAP 服务器认证成功后，假如请求的用户的家目录不存在，则将会被创建：# authconfig --enableldap --enableldapauth --ldapserver=rhel7.mydomain.com --ldapbasedn="dc=mydomain,dc=com" --enablemkhomedir --update LDAP 客户端认证总结在这篇文章中，我们已经解释了如何利用一个 LDAP 服务器来设置基本的认证。若想对当前这个指南里描述的设置进行更深入的配置，请参考位于 RHEL 系统管理员指南里的 第 13 章 – LDAP 的配置，并特别注意使用 TLS 来进行安全设定。请随意使用下面的评论框来留下你的提问。via: http://www.tecmint.com/setup-ldap-server-and-configure-client-authentication/作者：Gabriel Cánepa 译者：FSSlc 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
RHCSA 系列（十三）： 在 RHEL 7 中使用 SELinux 进行强制访问控制
在本系列的前面几篇文章中，我们已经详细地探索了至少两种访问控制方法：标准的 ugo/rwx 权限（RHCSA 系列（三）: 如何管理 RHEL7 的用户和组） 和访问控制列表（RHCSA 系列（七）: 使用 ACL（访问控制列表) 和挂载 Samba/NFS 共享）。RHCSA 认证：SELinux 精要和控制文件系统的访问尽管作为第一级别的权限和访问控制机制是必要的，但它们同样有一些局限，而这些局限则可以由 安全增强 Linux （ Security Enhanced Linux，简称为 SELinux ） 来处理。这些局限的一种情形是：某个用户可能通过一个泛泛的 chmod 命令将文件或目录暴露出现了安全违例，从而引起访问权限的意外传播。结果，由该用户开启的任意进程可以对属于该用户的文件进行任意的操作，最终一个恶意的或有其它缺陷的软件可能会取得整个系统的 root 级别的访问权限。考虑到这些局限性，美国国家安全局（NSA） 率先设计出了 SELinux，一种强制的访问控制方法，它根据最小权限模型去限制进程在系统对象（如文件，目录，网络接口等）上的访问或执行其他的操作的能力，而这些限制可以在之后根据需要进行修改。简单来说，系统的每一个元素只给某个功能所需要的那些权限。在 RHEL 7 中，SELinux 被并入了内核中，且默认情况下以 强制模式 （ Enforcing ） 开启。在这篇文章中，我们将简要地介绍有关 SELinux 及其相关操作的基本概念。SELinux 的模式SELinux 可以以三种不同的模式运行： 强制模式 （ Enforcing ） ：SELinux 基于其策略规则来拒绝访问，这些规则是用以控制安全引擎的一系列准则； 宽容模式 （ Permissive ） ：SELinux 不会拒绝访问，但对于那些如果运行在强制模式下会被拒绝访问的行为进行记录； 关闭 （ Disabled ） (不言自明，即 SELinux 没有实际运行).使用 getenforce 命令可以展示 SELinux 当前所处的模式，而 setenforce 命令（后面跟上一个 1 或 0） 则被用来将当前模式切换到 强制模式 （ Enforcing ） 或 宽容模式 （ Permissive ） ，但只对当前的会话有效。为了使得在登出和重启后上面的设置还能保持作用，你需要编辑 /etc/selinux/config 文件并将 SELINUX 变量的值设为 enforcing，permissive，disabled 中之一：# getenforce # setenforce 0 # getenforce # setenforce 1 # getenforce # cat /etc/selinux/config 设置 SELinux 模式通常情况下，你应该使用 setenforce 来在 SELinux 模式间进行切换（从强制模式到宽容模式，或反之），以此来作为你排错的第一步。假如 SELinux 当前被设置为强制模式，而你遇到了某些问题，但当你把 SELinux 切换为宽容模式后问题不再出现了，则你可以确信你遇到了一个 SELinux 权限方面的问题。SELinux 上下文一个 SELinux 上下文 （ Context ） 由一个访问控制环境所组成，在这个环境中，决定的做出将基于 SELinux 的用户，角色和类型（和可选的级别）：一个 SELinux 用户是通过将一个常规的 Linux 用户账户映射到一个 SELinux 用户账户来实现的，反过来，在一个会话中，这个 SELinux 用户账户在 SELinux 上下文中被进程所使用，以便能够明确定义它们所允许的角色和级别。角色的概念是作为域和处于该域中的 SELinux 用户之间的媒介，它定义了 SELinux 可以访问到哪个进程域和哪些文件类型。这将保护您的系统免受提权漏洞的攻击。类型则定义了一个 SELinux 文件类型或一个 SELinux 进程域。在正常情况下，进程将会被禁止访问其他进程正使用的文件，并禁止对其他进程进行访问。这样只有当一个特定的 SELinux 策略规则允许它访问时，才能够进行访问。下面就让我们看看这些概念是如何在下面的例子中起作用的。例 1：改变 sshd 守护进程的默认端口在 RHCSA 系列（八）: 加固 SSH，设定主机名及启用网络服务 中，我们解释了更改 sshd 所监听的默认端口是加固你的服务器免受外部攻击的首要安全措施。下面，就让我们编辑 /etc/ssh/sshd_config 文件并将端口设置为 9999：Port 9999 保存更改并重启 sshd：# systemctl restart sshd # systemctl status sshd 重启 SSH 服务正如你看到的那样， sshd 启动失败，但为什么会这样呢？快速检查 /var/log/audit/audit.log 文件会发现 sshd 已经被拒绝在端口 9999 上开启（SELinux 的日志信息包含单词 "AVC"，所以这类信息可以被轻易地与其他信息相区分），因为这个端口是 JBoss 管理服务的保留端口：# cat /var/log/audit/audit.log | grep AVC | tail -1 查看 SSH 日志在这种情况下，你可以像先前解释的那样禁用 SELinux（但请不要这样做！），并尝试重启 sshd，且这种方法能够起效。但是， semanage 应用可以告诉我们在哪些端口上可以开启 sshd 而不会出现任何问题。运行：# semanage port -l | grep ssh 便可以得到一个 SELinux 允许 sshd 在哪些端口上监听的列表：Semanage 工具所以让我们在 /etc/ssh/sshd_config 中将端口更改为 9998 端口，增加这个端口到 sshportt 的上下文，然后重启 sshd 服务：# semanage port -a -t ssh_port_t -p tcp 9998 # systemctl restart sshd # systemctl is-active sshd semanage 添加端口如你所见，这次 sshd 服务被成功地开启了。这个例子告诉我们一个事实：SELinux 用它自己的端口类型的内部定义来控制 TCP 端口号。例 2：允许 httpd 访问 sendmail这是一个 SELinux 管理一个进程来访问另一个进程的例子。假如在你的 RHEL 7 服务器上，你要为 Apache 配置 mod\_security 和 mod\_evasive，你需要允许 httpd 访问 sendmail，以便在遭受到 (D)DoS 攻击时能够用邮件来提醒你。在下面的命令中，如果你不想使得更改在重启后仍然生效，请去掉 -P 选项。# semanage boolean -1 | grep httpd_can_sendmail # setsebool -P httpd_can_sendmail 1 # semanage boolean -1 | grep httpd_can_sendmail 允许 Apache 发送邮件从上面的例子中，你可以知道 SELinux 布尔设定（或者只是布尔值）分别对应于 true 或 false，被嵌入到了 SELinux 策略中。你可以使用 semanage boolean -l 来列出所有的布尔值，也可以管道至 grep 命令以便筛选输出的结果。例 3：在一个特定目录而非默认目录下提供一个静态站点服务假设你正使用一个不同于默认目录（/var/www/html）的目录来提供一个静态站点服务，例如 /websites 目录（这种情形会出现在当你把你的网络文件存储在一个共享网络设备上，并需要将它挂载在 /websites 目录时）。a). 在 /websites 下创建一个 index.html 文件并包含如下的内容： SELinux test 假如你执行# ls -lZ /websites/index.html 你将会看到这个 index.html 已经被标记上了 default\_t SELinux 类型，而 Apache 不能访问这类文件：检查 SELinux 文件的权限b). 将 /etc/httpd/conf/httpd.conf 中的 DocumentRoot 改为 /websites，并不要忘了 更新相应的 Directory 块。然后重启 Apache。c). 浏览 http://<web server IP address>，则你应该会得到一个 503 Forbidden 的 HTTP 响应。d). 接下来，递归地改变 /websites 的标志，将它的标志变为 httpd_sys_content_t 类型，以便赋予 Apache 对这些目录和其内容的只读访问权限：# semanage fcontext -a -t httpd_sys_content_t "/websites(/.*)?" e). 最后，应用在 d) 中创建的 SELinux 策略：# restorecon -R -v /websites 现在重启 Apache 并再次浏览到 http://<web server IP address>，则你可以看到被正确展现出来的 html 文件：确认 Apache 页面总结在本文中，我们详细地介绍了 SELinux 的基础知识。请注意，由于这个主题的广泛性，在单篇文章中做出一个完全详尽的解释是不可能的，但我们相信，在这个指南中列出的基本原则将会对你进一步了解更高级的话题有所帮助，假如你想了解的话。假如可以，请让我推荐两个必要的资源来入门 SELinux：NSA SELinux 页面 和 针对用户和系统管理员的 RHEL 7 SELinux 指南。假如你有任何的问题或评论，请不要犹豫，让我们知晓吧。via: http://www.tecmint.com/selinux-essentials-and-control-filesystem-access/作者：Gabriel Cánepa 译者：FSSlc 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
无论是在数据中心还是实验室环境，Linux 服务器很少是独立的机器，很可能有时你需要安装多个以某种方式相互联系的机器。假如你将在单个服务器上手动安装 RHEL 7 所花的时间乘以你需要配置的机器数量，这将导致你必须做出一场相当长的努力，而通过使用被称为 kicksta 的无人值守安装工具则可以避免这样的麻烦。在这篇文章中，我们将向你展示使用 kickstart 工具时所需的一切，以便在安装过程中，不用你时不时地照看“处在襁褓中”的服务器。RHCSA： RHEL 7 的自动化 Kickstart 安装Kickstart 和自动化安装简介Kickstart 是一种被用来执行无人值守操作系统安装和配置的自动化安装方法，主要被 RHEL（以及其他 Fedora 的副产品，如 CentOS，Oracle Linux 等）所使用。因此，kickstart 安装方法可使得系统管理员只需考虑需要安装的软件包组和系统的配置，便可以得到相同的系统，从而省去必须手动安装这些软件包的麻烦。准备 Kickstart 安装要执行 kickstart 安装，我们需要遵循下面的这些步骤：创建一个 Kickstart 文件，它是一个带有多个预定义配置选项的纯文本文件。将 Kickstart 文件保存在可移动介质上，如一个硬盘或一个网络位置。kickstart 客户端需要使用 rhel-server-7.0-x86_64-boot.iso 镜像文件，而你还需要可从一个网络资源上获取得到完整的 ISO 镜像 rhel-server-7.0-x86_64-dvd.iso ，例如通过一个 FTP 服务器的 HTTP 服务形式（在我们当前的例子中，我们将使用另一个 IP 地址为 192.168.0.18 的 RHEL 7 机器）。开始 Kickstart 安装。要创建一个 kickstart 文件，请登录你的红帽客户门户网站（Red Hat Customer Portal）帐户，并使用 Kickstart 配置工具 来选择所需的安装选项。在向下滑动之前请仔细阅读每个选项，然后选择最适合你需求的选项：Kickstart 配置工具假如你指定安装将通过 HTTP，FTP，NFS 来执行，请确保服务器上的防火墙允许这些服务通过。尽管你可以使用红帽的在线工具来创建一个 kickstart 文件，但你还可以使用下面的代码来作为参考手动地创建它。例如，你可以注意到，下面的代码指定了安装过程将使用英语环境，使用拉丁美洲键盘布局，并设定时区为 America/Argentina/San\_Luis 时区：lang en_US keyboard la-latin1 timezone America/Argentina/San_Luis --isUtc rootpw $1$5sOtDvRo$In4KTmX7OmcOW9HUvWtfn0 --iscrypted #platform x86, AMD64, or Intel EM64T text url --url=http://192.168.0.18//kickstart/media bootloader --location=mbr --append="rhgb quiet crashkernel=auto" zerombr clearpart --all --initlabel autopart auth --passalgo=sha512 --useshadow selinux --enforcing firewall --enabled firstboot --disable %packages @base @backup-server @print-server %end 在上面的在线配置工具中，在选择以 HTTP 来作为安装源后，设置好在安装过程中使用 192.168.0.18 来作为 HTTP 服务器的地址，/kickstart/tecmint.bin 作为 HTTP 目录。在上面的 kickstart 示例文件中，你需要特别注意url --url=http://192.168.0.18//kickstart/media 这个目录是你展开 DVD 或 ISO 安装介质内容的地方。在执行解压之前，我们将把 ISO 安装文件作为一个回环设备挂载到 /media/rhel 目录下：# mount -o loop /var/www/html/kickstart/rhel-server-7.0-x86_64-dvd.iso /media/rhel 挂载 RHEL ISO 镜像接下来，复制 /media/rhel 中的全部文件到 /var/www/html/kickstart/media 目录：# cp -R /media/rhel /var/www/html/kickstart/media 这一步做完后，/var/www/html/kickstart/media 目录中的文件列表和磁盘使用情况将如下所示：Kickstart 媒体文件现在，我们已经准备好开始 kickstart 安装了。不管你如何选择创建 kickstart 文件的方式，在执行安装之前检查下这个文件的语法是否有误总是一个不错的主意。为此，我们需要安装 pykickstart 软件包。# yum update && yum install pykickstart 然后使用 ksvalidator 工具来检查这个文件：# ksvalidator /var/www/html/kickstart/tecmint.bin 假如文件中的语法正确，你将不会得到任何输出，反之，假如文件中存在错误，你得到警告，向你提示在某一行中语法不正确或出错原因未知。执行 Kickstart 安装首先，使用 rhel-server-7.0-x86\_64-boot.iso 来启动你的客户端。当初始屏幕出现时，选择安装 RHEL 7.0 ，然后按 Tab 键来追加下面这一句，接着按 Enter 键：# inst.ks=http://192.168.0.18/kickstart/tecmint.bin RHEL Kickstart 安装其中 tecmint.bin 是先前创建的 kickstart 文件。当你按了 Enter 键后，自动安装就开始了，且你将看到一个列有正在被安装的软件的列表（软件包的数目和名称根据你所选择的程序和软件包组而有所不同）：RHEL 7 的自动化 Kickstart 安装当自动化过程结束后，将提示你移除安装介质，接着你就可以启动到你新安装的系统中了：RHEL 7 启动屏幕尽管你可以像我们前面提到的那样，手动地创建你的 kickstart 文件，但你应该尽可能地考虑使用受推荐的方式：你可以使用在线配置工具，或者使用在安装过程中创建的位于 root 家目录下的 anaconda-ks.cfg 文件。这个文件实际上就是一个 kickstart 文件，你或许想在选择好所有所需的选项（可能需要更改逻辑卷布局或机器上所用的文件系统）后手动地安装第一个机器，接着使用产生的 anaconda-ks.cfg 文件来自动完成其余机器的安装过程。另外，使用在线配置工具或 anaconda-ks.cfg 文件来引导将来的安装将允许你在系统安装时以加密的形式设置 root 密码。总结既然你知道了如何创建 kickstart 文件并如何使用它们来自动完成 RHEL 7 服务器的安装，你就可以不用时时照看安装进度的过程了。这将给你时间来做其他的事情，或者若你足够幸运，你还可以用来休闲一番。无论以何种方式，请使用下面的评论栏来让我们知晓你对这篇文章的看法。提问也同样欢迎！另外，请阅读：使用 PXE 和 kickstart 来自动化安装多个 RHEL/CentOS 7 发行版本via: http://www.tecmint.com/automatic-rhel-installations-using-kickstart/作者：Gabriel Cánepa 译者：FSSlc 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
简单来说，防火墙就是一个基于一系列预先定义的规则（例如流量包的目的地或来源，流量的类型等）的安全系统，它控制着一个网络中的流入和流出流量。RHCSA: 使用 FirewallD 和 Iptables 来控制网络流量 – Part 11在本文中，我们将回顾 firewalld 和 iptables 的基础知识。前者是 RHEL 7 中的默认动态防火墙守护进程，而后者则是针对 Linux 的传统的防火墙服务，大多数的系统和网络管理员都非常熟悉它，并且在 RHEL 7 中也可以用。FirewallD 和 Iptables 的一个比较在后台， firewalld 和 iptables 服务都通过相同的接口来与内核中的 netfilter 框架相交流，这不足为奇，即它们都通过 iptables 命令来与 netfilter 交互。然而，与 iptables 服务相反， firewalld 可以在不丢失现有连接的情况下，在正常的系统操作期间更改设定。在默认情况下， firewalld 应该已经安装在你的 RHEL 系统中了，尽管它可能没有在运行。你可以使用下面的命令来确认（firewall-config 是用户界面配置工具）：# yum info firewalld firewall-config 检查 FirewallD 的信息以及，# systemctl status -l firewalld.service 检查 FirewallD 的状态另一方面， iptables 服务在默认情况下没有被包含在 RHEL 系统中，但可以被安装上。# yum update && yum install iptables-services 这两个守护进程都可以使用常规的 systemd 命令来在开机时被启动和开启：# systemctl start firewalld.service | iptables-service.service # systemctl enable firewalld.service | iptables-service.service 另外，请阅读：管理 Systemd 服务的实用命令至于配置文件， iptables 服务使用 /etc/sysconfig/iptables 文件（假如这个软件包在你的系统中没有被安装，则这个文件将不存在）。在一个被用作集群节点的 RHEL 7 机子上，这个文件看起来是这样：Iptables 防火墙配置文件而 firewalld 则在两个目录中存储它的配置文件，即 /usr/lib/firewalld 和 /etc/firewalld：# ls /usr/lib/firewalld /etc/firewalld FirewallD 的配置文件在这篇文章中后面，我们将进一步查看这些配置文件，在那之后，我们将在这两个地方添加一些规则。现在，是时候提醒你了，你总可以使用下面的命令来找到更多有关这两个工具的信息。# man firewalld.conf # man firewall-cmd # man iptables 除了这些，记得查看一下当前系列的第一篇 RHCSA 系列（一）: 回顾基础命令及系统文档，在其中我描述了几种渠道来得到安装在你的 RHEL 7 系统上的软件包的信息。使用 Iptables 来控制网络流量在进一步深入之前，或许你需要参考 Linux 基金会认证工程师（Linux Foundation Certified Engineer,LFCE） 系列中的 配置 Iptables 防火墙 – Part 8 来复习你脑中有关 iptables 的知识。例 1：同时允许流入和流出的网络流量TCP 端口 80 和 443 是 Apache web 服务器使用的用来处理常规（HTTP）和安全（HTTPS）网络流量的默认端口。你可以像下面这样在 enp0s3 接口上允许流入和流出网络流量通过这两个端口：# iptables -A INPUT -i enp0s3 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -o enp0s3 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT # iptables -A INPUT -i enp0s3 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -o enp0s3 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT 例 2：从某个特定网络中阻挡所有（或某些）流入连接或许有时你需要阻挡来自于某个特定网络的所有（或某些）类型的来源流量，比方说 192.168.1.0/24：# iptables -I INPUT -s 192.168.1.0/24 -j DROP 上面的命令将丢掉所有来自 192.168.1.0/24 网络的网络包，而# iptables -A INPUT -s 192.168.1.0/24 --dport 22 -j ACCEPT 将只允许通过端口 22 的流入流量。例 3：将流入流量重定向到另一个目的地假如你不仅使用你的 RHEL 7 机子来作为一个软件防火墙，而且还将它作为一个硬件防火墙，使得它位于两个不同的网络之间，那么在你的系统上 IP 转发一定已经被开启了。假如没有开启，你需要编辑 /etc/sysctl.conf 文件并将 net.ipv4.ip_forward 的值设为 1，即：net.ipv4.ip_forward = 1 接着保存更改，关闭你的文本编辑器，并最终运行下面的命令来应用更改：# sysctl -p /etc/sysctl.conf 例如，你可能在一个内部的机子上安装了一个打印机，它的 IP 地址为 192.168.0.10，CUPS 服务在端口 631 上进行监听（同时在你的打印服务器和你的防火墙上）。为了从防火墙另一边的客户端传递打印请求，你应该添加下面的 iptables 规则：# iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 631 -j DNAT --to 192.168.0.10:631 请记住 iptables 会逐条地读取它的规则，所以请确保默认的策略或后面的规则不会重载上面例子中那些规则。FirewallD 入门firewalld 引入的一个变化是区域（zone） （注：翻译参考了 https://fedoraproject.org/wiki/FirewallD/zh-cn ）。这个概念允许将网路划分为拥有不同信任级别的区域，由用户决定将设备和流量放置到哪个区域。要获取活动的区域，使用：# firewall-cmd --get-active-zones 在下面的例子中，public 区域是激活的，并且 enp0s3 接口被自动地分配到了这个区域。要查看有关一个特定区域的所有信息，可使用：# firewall-cmd --zone=public --list-all 列出所有的 Firewalld 区域由于你可以在 RHEL 7 安全指南 中阅读到更多有关区域的知识，这里我们将仅列出一些特别的例子。例 4：允许服务通过防火墙要获取受支持的服务的列表，可以使用：# firewall-cmd --get-services 列出所有受支持的服务要立刻生效且在随后重启后都可以让 http 和 https 网络流量通过防火墙，可以这样：# firewall-cmd --zone=MyZone --add-service=http # firewall-cmd --zone=MyZone --permanent --add-service=http # firewall-cmd --zone=MyZone --add-service=https # firewall-cmd --zone=MyZone --permanent --add-service=https # firewall-cmd --reload 假如 -–zone 被忽略，则使用默认的区域（你可以使用 firewall-cmd –get-default-zone来查看）。若要移除这些规则，可以在上面的命令中将 add 替换为 remove。例 5：IP 转发或端口转发首先，你需要查看在目标区域中，伪装（masquerading）是否被开启：# firewall-cmd --zone=MyZone --query-masquerade 在下面的图片中，我们可以看到对于外部区域，伪装已被开启，但对于公用区域则没有：查看伪装状态你可以为公共区域开启伪装：# firewall-cmd --zone=public --add-masquerade 或者在外部区域中使用伪装。下面是使用 firewalld 来重复例 3 中的任务所需的命令：# firewall-cmd --zone=external --add-forward-port=port=631:proto=tcp:toport=631:toaddr=192.168.0.10 不要忘了重新加载防火墙。在 RHCSA 系列的 第九部分 你可以找到更深入的例子，在那篇文章中我们解释了如何允许或禁用通常被 web 服务器和 ftp 服务器使用的端口，以及在针对这两个服务所使用的默认端口被改变时，如何更改相应的规则。另外，你或许想参考 firewalld 的 wiki 来查看更深入的例子。延伸阅读： 在 RHEL 7 中配置防火墙的几个实用的 firewalld 例子总结在这篇文章中，我们已经解释了防火墙是什么，介绍了在 RHEL 7 中用来实现防火墙的几个可用的服务，并提供了可以帮助你入门防火墙的几个例子。假如你有任何的评论，建议或问题，请随意使用下面的评论框来让我们知晓。这里就事先感谢了！via: http://www.tecmint.com/firewalld-vs-iptables-and-control-network-traffic-in-firewall/作者：Gabriel Cánepa 译者：FSSlc 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
在这篇文章中，我们将回顾如何在 RHEL7 中安装，更新和删除软件包。我们还将介绍如何使用 cron 进行任务自动化，并完成如何查找和监控系统日志文件，以及为什么这些技能是系统管理员必备技能。RHCSA: Yum包管理、任务计划和系统监控 – Part 10使用yum 管理包要安装一个包以及所有尚未安装的依赖包，您可以使用：# yum -y install package_name(s) package\_name(s) 需要是至少一个真实的软件包名例如，安装 httpd 和 mlocate（按顺序），输入。# yum -y install httpd mlocate 注意: 字符 y 表示绕过执行下载和安装前的确认提示。如果需要提示，你可以不用它。默认情况下，yum 将安装与操作系统体系结构相匹配的包，除非通过在包名加入架构名。例如，在 64 位系统上，yum install package将安装包的 x86\_64 版本，而 yum install package.x86（如果有的话）将安装 32 位的。有时，你想安装一个包，但不知道它的确切名称。search all 选项可以在当前启用的软件库中的包名称和包描述中搜索它，或者search选项可以在包名称中搜索。比如，# yum search log 将搜索安装的软件库中名字和摘要与该词（log）类似的软件，而# yum search all log 也将在包描述和网址中寻找寻找相同的关键字。一旦搜索返回包列表，您可能希望在安装前显示一些信息。这时 info 选项派上了用场：# yum info logwatch 搜索包信息您可以定期用以下命令检查更新：# yum check-update 上述命令将返回可以更新的所有已安装的软件包。在下图所示的例子中，只有 rhel-7-server-rpms 有可用更新：检查包更新然后，您可以更新该包，# yum update rhel-7-server-rpms 如果有几个包可以一同更新，可以使用 yum update 一次性更新所有的包。当你知道一个可执行文件的名称，如 ps2pdf，但不知道那个包提供了它？你可以通过 yum whatprovides “*/[executable]”找到:# yum whatprovides “*/ps2pdf” 查找文件属于哪个包当删除包时，你可以使用 yum remove Package ，很简单吧？Yum 是一个完整而强大的包管理器。# yum remove httpd 参见： 20 个管理 RHEL 7 软件包的 Yum 命令文本式 RPM 工具RPM（又名 RPM 包管理器，原意是 RedHat 软件包管理器）也可用于安装或更新独立的rpm格式的软件包。往往使用 -Uvh 表明如果这个包没有安装就安装它，如果已存在就尝试更新。这里-U表示更新、-v表示显示详细输出，用-h显示进度条。例如# rpm -Uvh package.rpm rpm 的另一个典型的使用方法是列出所有安装的软件包，# rpm -qa 查询所有包参见： 20 个管理 RHEL 7 软件包的 RPM 命令使用 Cron 调度任务Linux 和 UNIX 类操作系统包括一个称为 Cron 的工具，允许你周期性调度任务（即命令或 shell 脚本）。cron 会每分钟定时检查 /var/spool/cron 目录中有在 /etc/passwd 帐户文件中指定用户名的文件。执行命令时，命令输出是发送到该 crontab 的所有者（或者可以在 /etc/crontab，通过 MAILTO 环境变量中指定用户）。crontab 文件（可以通过键入 crontab -e并按 Enter 键创建）的格式如下：crontab条目因此，如果我们想在每个月第二天上午2:15更新本地文件数据库（用于按名字或通配模式定位文件），我们需要添加以下 crontab 条目：15 02 2 * * /bin/updatedb 以上的条目的意思是：”每年每月第二天的凌晨 2：15 运行 /bin/updatedb，无论是周几”，我想你也猜到了。星号作为通配符。正如我们前面所提到的，添加一个 cron 任务后，你可以看到一个名为 root 的文件被添加在 /var/spool/cron。该文件列出了所有的 crond 守护进程应该运行的任务：# ls -l /var/spool/cron 检查所有cron任务在上图中，显示当前用户的 crontab 可以使用 cat /var/spool/cron 或# crontab -l 如果你需要在一个更精细的时间上运行的任务（例如，一天两次或每月三次），cron 也可以做到。例如，每个月1号和15号运行 /my/script 并将输出导出到 /dev/null （丢弃输出），您可以添加如下两个crontab 条目：01 00 1 * * /myscript > /dev/null 2>&1 01 00 15 * * /my/script > /dev/null 2>&1 不过为了简单，你可以将他们合并：01 00 1,15 * * /my/script > /dev/null 2>&1 跟着前面的例子，我们可以在每三个月的第一天的凌晨1：30运行 /my/other/script。30 01 1 1,4,7,10 * /my/other/script > /dev/null 2>&1 但是当你必须每隔某分钟、小时、天或月来重复某个任务时，你可以通过所需的频率来划分正确的时间。以下与前一个 crontab 条目具有相同的意义：30 01 1 */3 * /my/other/script > /dev/null 2>&1 或者也许你需要在一个固定的频率或系统启动后运行某个固定的工作，你可以使用下列五个字符串中的一个字符串来指示你想让你的任务计划工作的确切时间：@reboot 仅系统启动时运行 @yearly 一年一次, 类似与 00 00 1 1 * @monthly 一月一次, 类似与 00 00 1 * * @weekly 一周一次, 类似与 00 00 * * 0 @daily 一天一次, 类似与 00 00 * * * @hourly 一小时一次, 类似与 00 * * * * 参见：11 个在 RHEL7 中调度任务的命令定位和查看日志系统日志存放（并轮转）在 /var/log 目录。根据 Linux 的文件系统层次标准（Linux Filesystem Hierarchy Standard），这个目录包括各种日志文件，并包含一些必要的子目录（如 audit、 httpd 或 samba ，如下图)，并由相应的系统守护进程操作：# ls /var/log Linux 日志的位置其他感兴趣的日志比如 dmesg（包括了所有内核层缓冲区的消息），secure（记录要求用户认证的连接请求)，messages（系统级信息），和 wtmp（记录了所有用户的登录、登出）。日志是非常重要的，它们让你可以看到任何时刻发生在你的系统的事情，以及已经过去的事情。他们是无价的工具，可以排错和监测一个 Linux 服务器，通常使用 tail -f 命令来实时显示正在发生和写入日志的事件。举个例子，如果你想看你的内核相关的日志，你需要输入如下命令：# tail -f /var/log/dmesg 同样的，如果你想查看你的 Web 服务器日志，你需要输入如下命令：# tail -f /var/log/httpd/access.log 总结如果你知道如何有效的管理包、调度任务、以及知道在哪寻找系统当前和过去操作的信息，你可以放松工作而不会总被吓到。我希望这篇文章能够帮你学习或回顾这些基础知识。如果你有任何问题或意见，请使用下面的表单反馈给我们。via: http://www.tecmint.com/yum-package-management-cron-job-scheduling-monitoring-linux-logs/作者：Gabriel Cánepa 译者：xiqingongzi 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
Web 服务器（也被称为 HTTP 服务器）是在网络中将内容（最为常见的是网页，但也支持其他类型的文件）进行处理并传递给客户端的服务。FTP 服务器是最为古老且最常使用的资源之一（即便到今天也是这样），在身份认证不是必须的情况下，它可通过客户端在一个网络访问文件，因为 FTP 使用没有加密的用户名和密码，所以有些情况下不需要验证也行。在 RHEL 7 中可用的 web 服务器是版本号为 2.4 的 Apache HTTP 服务器。至于 FTP 服务器，我们将使用 Very Secure Ftp Daemon (又名 vsftpd) 来建立用 TLS 加固的连接。RHCSA: 安装，配置及加固 Apache 和 FTP 服务器 – Part 9在这篇文章中，我们将解释如何在 RHEL 7 中安装、配置和加固 web 和 FTP 服务器。安装 Apache 和 FTP 服务器在本指导中，我们将使用一个静态 IP 地址为 192.168.0.18/24 的 RHEL 7 服务器。为了安装 Apache 和 VSFTPD，运行下面的命令：# yum update && yum install httpd vsftpd 当安装完成后，这两个服务在开始时是默认被禁用的，所以我们需要暂时手动开启它们并让它们在下一次启动时自动地开启它们：# systemctl start httpd # systemctl enable httpd # systemctl start vsftpd # systemctl enable vsftpd 另外，我们必须打开 80 和 21 端口，它们分别是 web 和 ftp 守护进程监听的端口，为的是允许从外面访问这些服务：# firewall-cmd --zone=public --add-port=80/tcp --permanent # firewall-cmd --zone=public --add-service=ftp --permanent # firewall-cmd --reload 为了确认 web 服务工作正常，打开你的浏览器并输入服务器的 IP，则你应该可以看到如下的测试页面：确认 Apache Web 服务器对于 ftp 服务器，在确保它如期望中的那样工作之前，我们必须进一步地配置它，我们将在几分钟后来做这件事。配置并加固 Apache Web 服务器Apache 的主要配置文件位于 /etc/httpd/conf/httpd.conf 中，但它可能依赖 /etc/httpd/conf.d 中的其他文件。尽管默认的配置对于大多数的情形都够用了，但熟悉在 官方文档 中介绍的所有可用选项是一个不错的主意。同往常一样，在编辑主配置文件前先做一个备份：# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.$(date +%Y%m%d) 然后用你钟爱的文本编辑器打开它，并查找下面这些变量：ServerRoot： 服务器的配置，错误和日志文件保存的目录。Listen： 通知 Apache 去监听特定的 IP 地址或端口。Include: 允许包含其他配置文件，要包含的文件必须存在，否则，服务器将会失败。它恰好与 IncludeOptional 相反，假如特定的配置文件不存在，它将静默地忽略掉它们。User 和 Group： 运行 httpd 服务的用户/组的名称。DocumentRoot： Apache 为你的文档所服务的目录。默认情况下，所有的请求将在这个目录中被获取，但符号链接和别名可能会被用于指向其他位置。ServerName： 这个指令将设定用于识别它自身的主机名（或 IP 地址）和端口。安全措施的第一步将包含创建一个特定的用户和组（如 tecmint/tecmint）来运行 web 服务器，以及更改默认的端口为一个更高的端口（在这个例子中为 9000） （LCTT 译注：如果你的 Web 服务器对外公开提供服务，则不建议修改为非默认端口。）：ServerRoot "/etc/httpd" Listen 192.168.0.18:9000 User tecmint Group tecmint DocumentRoot "/var/www/html" ServerName 192.168.0.18:9000 你可以使用下面的命令来测试配置文件：# apachectl configtest 假如一切 OK，接着重启 web 服务器。# systemctl restart httpd 并别忘了在防火墙中开启新的端口（并禁用旧的端口）：# firewall-cmd --zone=public --remove-port=80/tcp --permanent # firewall-cmd --zone=public --add-port=9000/tcp --permanent # firewall-cmd --reload 请注意，由于 SELinux 策略，你只能给给 web 服务器使用如下命令所返回的端口。# semanage port -l | grep -w '^http_port_t' 假如你想让 httpd 服务使用另一个端口（如 TCP 端口 8100），你必须将它加到 SELinux 的端口上下文：# semanage port -a -t http_port_t -p tcp 8100 添加 Apache 端口到 SELinux 策略为了进一步加固你安装的 Apache，请遵循以下步骤：运行 Apache 的用户不应该拥有访问 shell 的能力：# usermod -s /sbin/nologin tecmint 禁用目录列表功能，这是为了阻止浏览器展示一个未包含 index.html 文件的目录里的内容。编辑 /etc/httpd/conf/httpd.conf (以及虚拟主机的配置文件，假如有的话)，并确保出现在顶层的和Directory 块中的 Options 指令都被设置为 None：Options None 在 HTTP 响应中隐藏有关 web 服务器和操作系统的信息。像下面这样编辑文件 /etc/httpd/conf/httpd.conf：ServerTokens Prod ServerSignature Off 现在，你已经做好了从 /var/www/html 目录开始服务内容的准备了。配置并加固 FTP 服务器和 Apache 的情形类似， Vsftpd 的主配置文件 /etc/vsftpd/vsftpd.conf 带有详细的注释，且虽然对于大多数的应用实例，默认的配置应该足够了，但为了更有效率地操作 ftp 服务器，你应该开始熟悉相关的文档和 man 页 man vsftpd.conf（对于这点，再多的强调也不为过！）。在我们的示例中，使用了这些指令：anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES chroot_local_user=YES allow_writeable_chroot=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES 通过使用 chroot_local_user=YES，（默认情况下）本地用户在登录之后，将被限制在以用户的家目录为 chroot 监狱的环境中。这意味着本地用户将不能访问除其家目录之外的任何文件。最后，为了让 ftp 能够在用户的家目录中读取文件，设置如下的 SELinux 布尔值：# setsebool -P ftp_home_dir on 现在，你可以使用一个客户端例如 Filezilla 来连接一个 ftp 服务器：查看 FTP 连接注意， /var/log/xferlog 日志将会记录下载和上传的情况，这与上图的目录列表一致：监视 FTP 的下载和上传情况另外请参考： 在 Linux 系统中使用 Trickle 来限制应用使用的 FTP 网络带宽总结在本教程中，我们解释了如何设置 web 和 ftp 服务器。由于这个主题的广泛性，涵盖这些话题的所有方面是不可能的（如虚拟主机）。因此，我推荐你也阅读这个网站中有关 Apache 的其他卓越的文章。via: http://www.tecmint.com/rhcsa-series-install-and-secure-apache-web-server-and-ftp-in-rhel/作者：Gabriel Cánepa 译者：FSSlc 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
作为一名系统管理员，你将经常使用一个终端模拟器来登录到一个远程的系统中，执行一系列的管理任务。你将很少有机会坐在一个真实的（物理）终端前，所以你需要设定好一种方法来使得你可以登录到你需要去管理的那台远程主机上。事实上，当你必须坐在一台物理终端前的时候，就可能是你登录到该主机的最后一种方法了。基于安全原因，使用 Telnet 来达到以上目的并不是一个好主意，因为穿行在线缆上的流量并没有被加密，它们以明文方式在传送。另外，在这篇文章中，我们也将复习如何配置网络服务来使得它在开机时被自动开启，并学习如何设置网络和静态或动态地解析主机名。RHCSA: 安全 SSH 和开启网络服务 – Part 8安装并确保 SSH 通信安全对于你来说，要能够使用 SSH 远程登录到一个 RHEL 7 机子，你必须安装 openssh，openssh-clients 和 openssh-servers 软件包。下面的命令不仅将安装远程登录程序，也会安装安全的文件传输工具以及远程文件复制程序：# yum update && yum install openssh openssh-clients openssh-servers 注意，也安装上服务器所需的相应软件包是一个不错的主意，因为或许在某个时刻，你想使用同一个机子来作为客户端和服务器。在安装完成后，如若你想安全地访问你的 SSH 服务器，你还需要考虑一些基本的事情。下面的设定应该出现在文件 /etc/ssh/sshd_config 中。1、 更改 sshd 守护进程的监听端口，从 22（默认的端口值）改为一个更高的端口值（2000 或更大），但首先要确保所选的端口没有被占用。例如，让我们假设你选择了端口 2500 。使用 netstat 来检查所选的端口是否被占用：# netstat -npltu | grep 2500 假如 netstat 没有返回任何信息，则你可以安全地为 sshd 使用端口 2500，并且你应该在上面的配置文件中更改端口的设定，具体如下：Port 2500 2、 只允许协议 2（LCTT 译注：SSHv1 已经被证明不安全，默认情况下 SSHv1 和 SSHv2 都支持，所以应该显示去掉如下配置行的注释，并只支持 SSHv2。）：Protocol 2 3、 配置验证超时的时间为 2 分钟，不允许以 root 身份登录，并将允许通过 ssh 登录的人数限制到最小：LoginGraceTime 2m PermitRootLogin no AllowUsers gacanepa 4、 假如可能，使用基于公钥的验证方式而不是使用密码：PasswordAuthentication no RSAAuthentication yes PubkeyAuthentication yes 这假设了你已经在你的客户端机子上创建了带有你的用户名的一个密钥对，并将公钥复制到了你的服务器上。开启 SSH 无密码登录配置网络和名称的解析1、 每个系统管理员都应该对下面这个系统配置文件非常熟悉：/etc/hosts 被用来在小型网络中解析“名称” “IP 地址”。文件 /etc/hosts 中的每一行拥有如下的结构：IP address - Hostname - FQDN 例如，192.168.0.10 laptop laptop.gabrielcanepa.com.ar 2、 /etc/resolv.conf 特别指定 DNS 服务器的 IP 地址和搜索域，它被用来在没有提供域名后缀时，将一个给定的查询名称对应为一个全称域名。在正常情况下，你不必编辑这个文件，因为它是由系统管理的。然而，若你非要改变 DNS 服务器的 IP 地址，建议你在该文件的每一行中，都应该遵循下面的结构：nameserver - IP address 例如，nameserver 8.8.8.8 3、 /etc/host.conf 特别指定在一个网络中主机名被解析的方法和顺序。换句话说，告诉名称解析器使用哪个服务，并以什么顺序来使用。尽管这个文件由几个选项，但最为常见和基本的设置包含如下的一行：order bind,hosts 它意味着解析器应该首先查看 resolv.conf 中特别指定的域名服务器，然后到 /etc/hosts 文件中查找解析的名称。4、 /etc/sysconfig/network 包含了所有网络接口的路由和全局主机信息。下面的值可能会被使用：NETWORKING=yes|no HOSTNAME=value 其中的 value 应该是 全称域名 （ FQDN ） 。GATEWAY=XXX.XXX.XXX.XXX 其中的 XXX.XXX.XXX.XXX 是网关的 IP 地址。GATEWAYDEV=value 在一个带有多个网卡的机器中， value 为网关设备名，例如 enp0s3。5、 位于 /etc/sysconfig/network-scripts 中的文件（网络适配器配置文件）。在上面提到的目录中，你将找到几个被命名为如下格式的文本文件。ifcfg-name 其中 name 为网卡的名称，由 ip link show 返回：检查网络连接状态例如：网络文件除了环回接口（loopback），你还可以为你的网卡指定相似的配置。注意，假如设定了某些变量，它们将为这个指定的接口覆盖掉 /etc/sysconfig/network 中定义的默认值。在这篇文章中，为了能够解释清楚，每行都被加上了注释，但在实际的文件中，你应该避免加上注释：HWADDR=08:00:27:4E:59:37 ### 网卡的 MAC 地址 TYPE=Ethernet ### 连接类型 BOOTPROTO=static ### 这代表着该网卡指定了一个静态地址。 ### 如果这个值指定为 dhcp，这个网卡会从 DHCP 服务器获取 IP 地址，并且就不应该出现以下两行。 IPADDR=192.168.0.18 NETMASK=255.255.255.0 GATEWAY=192.168.0.1 NM_CONTROLLED=no ### 应该给以太网卡设置，以便可以让 NetworkManager 可以修改这个文件。 NAME=enp0s3 UUID=14033805-98ef-4049-bc7b-d4bea76ed2eb ONBOOT=yes ### 操作系统会在启动时打开这个网卡。 设定主机名在 RHEL 7 中， hostnamectl 命令被同时用来查询和设定系统的主机名。要展示当前的主机名，输入：# hostnamectl status 检查系统的主机名要更改主机名，使用# hostnamectl set-hostname [new hostname] 例如，# hostnamectl set-hostname cinderella 要想使得更改生效，你需要重启 hostnamed 守护进程（这样你就不必因为要应用更改而登出并再登录系统）：# systemctl restart systemd-hostnamed 设定系统主机名另外， RHEL 7 还包含 nmcli 工具，它可被用来达到相同的目的。要展示主机名，运行：# nmcli general hostname 且要改变主机名，则运行：# nmcli general hostname [new hostname] 例如，# nmcli general hostname rhel7 使用 nmcli 命令来设定主机名在开机时开启网络服务作为本文的最后部分，就让我们看看如何确保网络服务在开机时被自动开启。简单来说，这个可通过创建符号链接到某些由服务的配置文件中的 [Install] 小节中指定的文件来实现。以 firewalld（/usr/lib/systemd/system/firewalld.service） 为例：[Install] WantedBy=basic.target Alias=dbus-org.fedoraproject.FirewallD1.service 要开启该服务，运行：# systemctl enable firewalld 另一方面，要禁用 firewalld，则需要移除符号链接：# systemctl disable firewalld 在开机时开启服务总结在这篇文章中，我们总结了如何安装 SSH 及使用它安全地连接到一个 RHEL 服务器；如何改变主机名，并在最后如何确保在系统启动时开启服务。假如你注意到某个服务启动失败，你可以使用 systemctl status -l [service] 和 journalctl -xn 来进行排错。请随意使用下面的评论框来让我们知晓你对本文的看法。提问也同样欢迎。我们期待着你的反馈！via: http://www.tecmint.com/rhcsa-series-secure-ssh-set-hostname-enable-network-services-in-rhel-7/作者：Gabriel Cánepa 译者：FSSlc 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
在上一篇文章(RHCSA 系列（六）)中，我们解释了如何使用 parted 和 ssm 来设置和配置本地系统存储。RHCSA 系列: 配置 ACL 及挂载 NFS/Samba 共享 – Part 7我们也讨论了如何创建和在系统启动时使用一个密码来挂载加密的卷。另外，我们告诫过你要避免在挂载的文件系统上执行危险的存储管理操作。记住了这点后，现在，我们将回顾在 RHEL 7 中最常使用的文件系统格式，然后将涵盖有关手动或自动挂载、使用和卸载网络文件系统（CIFS 和 NFS）的话题以及在你的操作系统上实现 访问控制列表 （ Access Control List ） 的使用。前提条件在进一步深入之前，请确保你可使用 Samba 服务和 NFS 服务（注意在 RHEL 7 中 NFSv2 已不再被支持）。在本次指导中，我们将使用一个IP 地址为 192.168.0.10 且同时运行着 Samba 服务和 NFS 服务的机器来作为服务器，使用一个 IP 地址为 192.168.0.18 的 RHEL 7 机器来作为客户端。在这篇文章的后面部分，我们将告诉你在客户端上你需要安装哪些软件包。RHEL 7 中的文件系统格式从 RHEL 7 开始，由于 XFS 的高性能和可扩展性，它已经被作为所有的架构中的默认文件系统。根据 Red Hat 及其合作伙伴在主流硬件上执行的最新测试，当前 XFS 已支持最大为 500 TB 大小的文件系统。另外，XFS 启用了 user_xattr（扩展用户属性） 和 acl（POSIX 访问控制列表）来作为默认的挂载选项，而不像 ext3 或 ext4（对于 RHEL 7 来说，ext2 已过时），这意味着当挂载一个 XFS 文件系统时，你不必显式地在命令行或 /etc/fstab 中指定这些选项（假如你想在后一种情况下禁用这些选项，你必须显式地使用 no_acl 和 no_user_xattr）。请记住扩展用户属性可以给文件和目录指定，用来存储任意的额外信息如 mime 类型，字符集或文件的编码，而用户属性中的访问权限由一般的文件权限位来定义。访问控制列表作为一名系统管理员，无论你是新手还是专家，你一定非常熟悉与文件和目录有关的常规访问权限，这些权限为所有者，所有组和“世界”（所有的其他人）指定了特定的权限（可读，可写及可执行）。但如若你需要稍微更新下你的记忆，请参考 RHCSA 系列（三）.但是，由于标准的 ugo/rwx 集合并不允许为不同的用户配置不同的权限，所以 ACL 便被引入了进来，为的是为文件和目录定义更加详细的访问权限，而不仅仅是这些特别指定的特定权限。事实上， ACL 定义的权限是由文件权限位所特别指定的权限的一个超集。下面就让我们看看这个转换是如何在真实世界中被应用的吧。存在两种类型的 ACL：访问 ACL，可被应用到一个特定的文件或目录上；以及默认 ACL，只可被应用到一个目录上。假如目录中的文件没有 ACL，则它们将继承它们的父目录的默认 ACL 。从一开始， ACL 就可以为每个用户，每个组或不在文件所属组中的用户配置相应的权限。ACL 可使用 setfacl 来设置（和移除），可相应地使用 -m 或 -x 选项。例如，让我们创建一个名为 tecmint 的组，并将用户 johndoe 和 davenull 加入该组：# groupadd tecmint # useradd johndoe # useradd davenull # usermod -a -G tecmint johndoe # usermod -a -G tecmint davenull 并且让我们检验这两个用户都已属于追加的组 tecmint：# id johndoe # id davenull 检验用户现在，我们在 /mnt 下创建一个名为 playground 的目录，并在该目录下创建一个名为 testfile.txt 的文件。我们将设定该文件的属组为 tecmint，并更改它的默认 ugo/rwx 权限为 770（即赋予该文件的属主和属组可读、可写和可执行权限）：# mkdir /mnt/playground # touch /mnt/playground/testfile.txt # chown :tecmint /mnt/playground/testfile.txt # chmod 770 /mnt/playground/testfile.txt 接着，依次切换为 johndoe 和 davenull 用户，并在文件中写入一些信息：# su johndoe $ echo "My name is John Doe" > /mnt/playground/testfile.txt $ su davenull $ echo "My name is Dave Null" >> /mnt/playground/testfile.txt 到目前为止，一切正常。现在我们让用户 gacanepa 来向该文件执行写操作 – 则写操作将会失败，这是可以预料的。$ su gacanepa $ echo "My name is Gabriel Canepa" >> /mnt/playground/testfile.txt 管理用户的权限但实际上我们需要用户 gacanepa（他不是组 tecmint 的成员）在文件 /mnt/playground/testfile.txt 上有写权限，那又该怎么办呢？首先映入你脑海里的可能是将该用户添加到组 tecmint 中。但那将使得他在所有该组具有写权限位的文件上均拥有写权限，但我们并不想这样，我们只想他能够在文件 /mnt/playground/testfile.txt 上有写权限。现在，让我们给用户 gacanepa 在 /mnt/playground/testfile.txt 文件上有读和写权限。以 root 的身份运行如下命令：# setfacl -R -m u:gacanepa:rwx /mnt/playground 则你将成功地添加一条 ACL，允许 gacanepa 对那个测试文件可写。然后切换为 gacanepa 用户，并再次尝试向该文件写入一些信息：$ echo "My name is Gabriel Canepa" >> /mnt/playground/testfile.txt 要观察一个特定的文件或目录的 ACL，可以使用 getfacl 命令：# getfacl /mnt/playground/testfile.txt 检查文件的 ACL要为目录设定默认 ACL（它的内容将被该目录下的文件继承，除非另外被覆写），在规则前添加 d:并特别指定一个目录名，而不是文件名：# setfacl -m d:o:r /mnt/playground 上面的 ACL 将允许不在属组中的用户对目录 /mnt/playground 中的内容有读权限。请注意观察这次更改前后 getfacl /mnt/playground 的输出结果的不同：在 Linux 中设定默认 ACL在官方的 RHEL 7 存储管理指导手册的第 20 章 中提供了更多有关 ACL 的例子，我极力推荐你看一看它并将它放在身边作为参考。挂载 NFS 网络共享要显示你服务器上可用的 NFS 共享的列表，你可以使用带有 -e 选项的 showmount 命令，再跟上机器的名称或它的 IP 地址。这个工具包含在 nfs-utils 软件包中：# yum update && yum install nfs-utils 接着运行：# showmount -e 192.168.0.10 则你将得到一个在 192.168.0.10 上可用的 NFS 共享的列表：检查可用的 NFS 共享要按照需求在本地客户端上使用命令行来挂载 NFS 网络共享，可使用下面的语法：# mount -t nfs -o [options] remote_host:/remote/directory /local/directory 其中，在我们的例子中，对应为：# mount -t nfs 192.168.0.10:/NFS-SHARE /mnt/nfs 若你得到如下的错误信息：Job for rpc-statd.service failed. See "systemctl status rpc-statd.service" and "journalctl -xn" for details.，请确保 rpcbind 服务被启用且已在你的系统中启动了。# systemctl enable rpcbind.socket # systemctl restart rpcbind.service 接着重启。这就应该达到了上面的目的，且你将能够像先前解释的那样挂载你的 NFS 共享了。若你需要在系统启动时自动挂载 NFS 共享，可以向 /etc/fstab 文件添加一个有效的条目：remote_host:/remote/directory /local/directory nfs options 0 0 上面的变量 remote\_host, /remote/directory, /local/directory 和 options(可选) 和在命令行中手动挂载一个 NFS 共享时使用的一样。按照我们前面的例子，对应为：192.168.0.10:/NFS-SHARE /mnt/nfs nfs defaults 0 0 挂载 CIFS (Samba) 网络共享Samba 代表一个特别的工具，使得在由 *nix 和 Windows 机器组成的网络中进行网络共享成为可能。要显示可用的 Samba 共享，可使用带有 -L 选项的 smbclient 命令，再跟上机器的名称或它的 IP 地址。这个工具包含在 samba\_client 软件包中：你将被提示在远程主机上输入 root 用户的密码：# smbclient -L 192.168.0.10 检查 Samba 共享要在本地客户端上挂载 Samba 网络共享，你需要已安装好 cifs-utils 软件包：# yum update && yum install cifs-utils 然后在命令行中使用下面的语法：# mount -t cifs -o credentials=/path/to/credentials/file //remote_host/samba_share /local/directory 其中，在我们的例子中，对应为：# mount -t cifs -o credentials=~/.smbcredentials //192.168.0.10/gacanepa /mnt/samba 其中 .smbcredentials 的内容是：username=gacanepa password=XXXXXX 它是一个位于 root 用户的家目录(/root/) 中的隐藏文件，其权限被设置为 600，所以除了该文件的属主外，其他人对该文件既不可读也不可写。请注意 samba\_share 是 Samba 共享的名称，由上面展示的 smbclient -L remote_host 所返回。现在，若你需要在系统启动时自动地使得 Samba 分享可用，可以向 /etc/fstab 文件添加一个像下面这样的有效条目：//remote_host:/samba_share /local/directory cifs options 0 0 上面的变量 remote\_host, /remote/directory, /local/directory 和 options(可选) 和在命令行中手动挂载一个 Samba 共享时使用的一样。按照我们前面的例子中所给的定义，对应为：//192.168.0.10/gacanepa /mnt/samba cifs credentials=/root/smbcredentials,defaults 0 0 结论在这篇文章中，我们已经解释了如何在 Linux 中设置 ACL，并讨论了如何在一个 RHEL 7 客户端上挂载 CIFS 和 NFS 网络共享。我建议你去练习这些概念，甚至混合使用它们（试着在一个挂载的网络共享上设置 ACL），直至你感觉掌握了。假如你有问题或评论，请随时随意地使用下面的评论框来联系我们。另外，请随意通过你的社交网络分享这篇文章。via: http://www.tecmint.com/rhcsa-exam-configure-acls-and-mount-nfs-samba-shares/作者：Gabriel Cánepa 译者：FSSlc 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
在本篇文章中，我们将讨论在 RHEL 7 中如何使用传统的工具来设置和配置本地系统存储，并介绍系统存储管理器（也称为 SSM），它将极大地简化上面的任务。RHCSA: 配置和加密系统存储 – Part 6请注意，我们将在这篇文章中展开这个话题，但由于该话题的宽泛性，我们将在下一期中继续介绍有关它的描述和使用。在 RHEL 7 中创建和修改分区在 RHEL 7 中， parted 是默认的用来处理分区的程序，且它允许你：展示当前的分区表操纵（扩大或缩小分区的大小）现有的分区利用空余的磁盘空间或额外的物理存储设备来创建分区强烈建议你在试图增加一个新的分区或对一个现有分区进行更改前，你应当确保该设备上没有任何一个分区正在使用（umount /dev/分区），且假如你正使用设备的一部分来作为 swap 分区，在进行上面的操作期间，你需要将它禁用（swapoff -v /dev/分区） 。实施上面的操作的最简单的方法是使用一个安装介质例如一个 RHEL 7 的 DVD 或 USB 安装盘以急救模式启动 RHEL（Troubleshooting → Rescue a Red Hat Enterprise Linux system），然后当让你选择一个选项来挂载现有的 Linux 安装时，选择“跳过”这个选项，接着你将看到一个命令行提示符，在其中你可以像下图显示的那样开始键入与在一个未被使用的物理设备上创建一个正常的分区时所用的相同的命令。RHEL 7 急救模式要启动 parted，只需键入：# parted /dev/sdb 其中 /dev/sdb 是你将要创建新分区所在的设备；然后键入 print 来显示当前设备的分区表：创建新的分区正如你所看到的那样，在这个例子中，我们正在使用一个 5 GB 的虚拟驱动器。现在我们将要创建一个 4 GB 的主分区，然后将它格式化为 xfs 文件系统，它是 RHEL 7 中默认的文件系统。你可以从一系列的文件系统中进行选择。你将需要使用 mkpart 来手动地创建分区，接着和平常一样，用 mkfs.类型 来对分区进行格式化，因为 mkpart 并不支持许多现代的文件系统的到即开即用。在下面的例子中，我们将为设备设定一个标记，然后在 /dev/sdb 上创建一个主分区 (p)，它从设备的 0% 开始，并在 4000MB(4 GB) 处结束。标记分区的名称接下来，我们将把分区格式化为 xfs 文件系统，然后再次打印出分区表，以此来确保更改已被应用。# mkfs.xfs /dev/sdb1 # parted /dev/sdb print 格式化分区为 XFS 文件系统对于旧一点的文件系统，在 parted 中你可以使用 resize 命令来改变分区的大小。不幸的是，这只适用于 ext2, fat16, fat32, hfs, linux-swap, 和 reiserfs （若 libreiserfs 已被安装）。因此，改变分区大小的唯一方式是删除它然后再创建它（所以，确保你对你的数据做了完整的备份！）。毫无疑问，在 RHEL 7 中默认的分区方案是基于 LVM 的。使用 parted 来移除一个分区，可以用：# parted /dev/sdb print # parted /dev/sdb rm 1 移除或删除分区逻辑卷管理(LVM)一旦一个磁盘被分好了分区，再去更改分区的大小就是一件困难或冒险的事了。基于这个原因，假如我们计划在我们的系统上对分区的大小进行更改，我们应当考虑使用 LVM 的可能性，而不是使用传统的分区系统。这样多个物理设备可以组成一个逻辑组，以此来存放任意数目的逻辑卷，而逻辑卷的增大或减少不会带来任何麻烦。简单来说，你会发现下面的示意图对记住 LVM 的基础架构或许有用。LVM 的基本架构创建物理卷，卷组和逻辑卷遵循下面的步骤是为了使用传统的卷管理工具来设置 LVM。由于你可以通过阅读这个网站上的 LVM 系列来扩展这个话题，我将只是概要的介绍设置 LVM 的基本步骤，然后与使用 SSM 来实现相同功能做个比较。注: 我们将使用整个磁盘 /dev/sdb 和 /dev/sdc 来作为物理卷（PV），但是否执行相同的操作完全取决于你。1. 使用 /dev/sdb 和 /dev/sdc 中 100% 的可用磁盘空间来创建分区 /dev/sdb1 和 /dev/sdc1：# parted /dev/sdb print # parted /dev/sdc print 创建新分区2. 分别在 /dev/sdb1 和 /dev/sdc1 上共创建 2 个物理卷。# pvcreate /dev/sdb1 # pvcreate /dev/sdc1 创建两个物理卷记住，你可以使用 pvdisplay /dev/sd{b,c}1 来显示有关新建的物理卷的信息。3. 在上一步中创建的物理卷之上创建一个卷组（VG）：# vgcreate tecmint_vg /dev/sd{b,c}1 创建卷组记住，你可使用 vgdisplay tecmint\_vg 来显示有关新建的卷组的信息。4. 像下面那样，在卷组 tecmint\_vg 之上创建 3 个逻辑卷（LV）：# lvcreate -L 3G -n vol01_docs tecmint_vg [vol01_docs → 3 GB] # lvcreate -L 1G -n vol02_logs tecmint_vg [vol02_logs → 1 GB] # lvcreate -l 100%FREE -n vol03_homes tecmint_vg [vol03_homes → 6 GB] 创建逻辑卷记住，你可以使用 lvdisplay tecmintvg 来显示有关在 tecmintvg 之上新建的逻辑卷的信息。5. 格式化每个逻辑卷为 xfs 文件系统格式（假如你计划在以后将要缩小卷的大小，请别使用 xfs 文件系统格式！）：# mkfs.xfs /dev/tecmint_vg/vol01_docs # mkfs.xfs /dev/tecmint_vg/vol02_logs # mkfs.xfs /dev/tecmint_vg/vol03_homes 6. 最后，挂载它们：# mount /dev/tecmint_vg/vol01_docs /mnt/docs # mount /dev/tecmint_vg/vol02_logs /mnt/logs # mount /dev/tecmint_vg/vol03_homes /mnt/homes 移除逻辑卷，卷组和物理卷7.现在我们将进行与刚才相反的操作并移除逻辑卷、卷组和物理卷：# lvremove /dev/tecmint_vg/vol01_docs # lvremove /dev/tecmint_vg/vol02_logs # lvremove /dev/tecmint_vg/vol03_homes # vgremove /dev/tecmint_vg # pvremove /dev/sd{b,c}1 8. 现在，让我们来安装 SSM，我们将看到如何只用一步就完成上面所有的操作！# yum update && yum install system-storage-manager 我们将和上面一样，使用相同的名称和大小：# ssm create -s 3G -n vol01_docs -p tecmint_vg --fstype ext4 /mnt/docs /dev/sd{b,c}1 # ssm create -s 1G -n vol02_logs -p tecmint_vg --fstype ext4 /mnt/logs /dev/sd{b,c}1 # ssm create -n vol03_homes -p tecmint_vg --fstype ext4 /mnt/homes /dev/sd{b,c}1 是的! SSM 可以让你：初始化块设备来作为物理卷创建一个卷组创建逻辑卷格式化逻辑卷，以及只使用一个命令来挂载它们9. 现在，我们可以使用下面的命令来展示有关物理卷、卷组或逻辑卷的信息：# ssm list dev # ssm list pool # ssm list vol 检查有关物理卷、卷组或逻辑卷的信息10. 正如我们知道的那样， LVM 的一个显著的特点是可以在不停机的情况下更改（增大或缩小）逻辑卷的大小：假定在 vol02logs 上我们用尽了空间，而 vol03homes 还留有足够的空间。我们将把 vol03homes 的大小调整为 4 GB，并使用剩余的空间来扩展 vol02logs：# ssm resize -s 4G /dev/tecmint_vg/vol03_homes 再次运行 ssm list pool，并记录 tecmint\_vg 中的剩余空间的大小：查看卷的大小然后执行：# ssm resize -s+1.99 /dev/tecmint_vg/vol02_logs 注: 在 -s 后的加号暗示特定值应该被加到当前值上。11. 使用 ssm 来移除逻辑卷和卷组也更加简单，只需使用：# ssm remove tecmint_vg 这个命令将返回一个提示，询问你是否确认删除卷组和它所包含的逻辑卷：移除逻辑卷和卷组管理加密的卷SSM 也给系统管理员提供了为新的或现存的卷加密的能力。首先，你将需要安装 cryptsetup 软件包：# yum update && yum install cryptsetup 然后写出下面的命令来创建一个加密卷，你将被要求输入一个密码来增强安全性：# ssm create -s 3G -n vol01_docs -p tecmint_vg --fstype ext4 --encrypt luks /mnt/docs /dev/sd{b,c}1 # ssm create -s 1G -n vol02_logs -p tecmint_vg --fstype ext4 --encrypt luks /mnt/logs /dev/sd{b,c}1 # ssm create -n vol03_homes -p tecmint_vg --fstype ext4 --encrypt luks /mnt/homes /dev/sd{b,c}1 我们的下一个任务是往 /etc/fstab 中添加条目来让这些逻辑卷在启动时可用，而不是使用设备识别编号(/dev/something)。我们将使用每个逻辑卷的 UUID （使得当我们添加其他的逻辑卷或设备后，我们的设备仍然可以被唯一的标记），而我们可以使用 blkid 应用来找到它们的 UUID：# blkid -o value UUID /dev/tecmint_vg/vol01_docs # blkid -o value UUID /dev/tecmint_vg/vol02_logs # blkid -o value UUID /dev/tecmint_vg/vol03_homes 在我们的例子中：找到逻辑卷的 UUID接着，使用下面的内容来创建 /etc/crypttab 文件(请更改 UUID 来适用于你的设置)：docs UUID=ba77d113-f849-4ddf-8048-13860399fca8 none logs UUID=58f89c5a-f694-4443-83d6-2e83878e30e4 none homes UUID=92245af6-3f38-4e07-8dd8-787f4690d7ac none 然后在 /etc/fstab 中添加如下的条目。请注意到 devicename (/dev/mapper/devicename) 是出现在 /etc/crypttab 中第一列的映射标识：# Logical volume vol01_docs: /dev/mapper/docs /mnt/docs ext4 defaults 0 2 # Logical volume vol02_logs /dev/mapper/logs /mnt/logs ext4 defaults 0 2 # Logical volume vol03_homes /dev/mapper/homes /mnt/homes ext4 defaults 0 2 现在重启（systemctl reboot），则你将被要求为每个逻辑卷输入密码。随后，你可以通过检查相应的挂载点来确保挂载操作是否成功：确保逻辑卷挂载点总结在这篇教程中，我们开始探索如何使用传统的卷管理工具和 SSM 来设置和配置系统存储，SSM 也在一个软件包中集成了文件系统和加密功能。这使得对于任何系统管理员来说，SSM 是一个非常有价值的工具。假如你有任何的问题或评论，请让我们知晓 – 请随意使用下面的评论框来与我们保存联系！via: http://www.tecmint.com/rhcsa-exam-create-format-resize-delete-and-encrypt-partitions-in-linux/作者：Gabriel Cánepa 译者：FSSlc 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出