- Linux管理员教程
- 主页
- CentOS概述
- 基本的CentOS Linux命令
- 文件/文件夹管理
- 用户管理
- 配额管理
- Systemd服务的启动和停止
- 使用systemctl进行资源管理
- 使用cgroups进行资源管理
- 进程管理
- 防火墙设置
- 在CentOS Linux中配置PHP
- 在CentOS Linux中设置Python
- 在CentOS Linux中配置Ruby
- 在CentOS Linux中设置Perl
- 安装和配置Open LDAP
- 创建SSL证书
- 安装Apache Web服务器CentOS 7
- 在CentOS 7上设置MySQL
- 设置Postfix MTA和IMAP/POP3
- 安装匿名FTP
- 远程管理
- CentOS中的流量监控
- 日志管理
- 备份和恢复
- 系统更新
- Shell脚本
- 包管理
- 卷管理
- Linux管理员实用资源
- Linux管理员快速指南
- Linux管理员 - 实用资源
- Linux管理员 - 讨论
Linux管理员快速指南
Linux管理员 - CentOS概述
CentOS作为商业级Linux发行版中独树一帜的存在,忠实于Linux的开源本质。第一个Linux内核是由赫尔辛基大学的一名大学生(Linus Torvalds)开发的,并结合了Richard Stallman创建和推广的GNU实用程序。CentOS拥有经过验证的开源许可,可以为当今的商业世界提供动力。
CentOS已迅速成为世界上最著名的服务器平台之一。任何寻求就业的Linux管理员都一定会遇到“优先考虑CentOS Linux经验”这样的字眼。从初创公司到《财富》10强科技巨头,CentOS已跻身全球服务器操作系统的高端行列。
使CentOS区别于其他Linux发行版的是以下几个方面的完美结合:
开源许可
致力于Linux专业的用户群体
良好的硬件支持
坚如磐石的稳定性和可靠性
专注于安全性和更新
严格遵守企业环境所需的软件打包标准
在开始学习之前,我们假设读者具备Linux和管理基础知识,例如:
什么是root用户?
root用户的权限
安全组和用户的基本概念
使用Linux终端模拟器的经验
基本的网络概念
对解释型编程语言(Perl、Python、Ruby)的基本理解
网络协议,例如HTTP、LDAP、FTP、IMAP、SMTP
构成计算机操作系统的核心:文件系统、驱动程序和内核
基本的CentOS Linux命令
在学习CentOS Linux管理员的工具之前,重要的是要注意Linux管理员命令行背后的理念。
Linux的设计基于Unix的“小型、精确的工具链,简化大型任务”的理念。从根本上说,Linux通常没有针对特定用途的大型单一用途应用程序。相反,它有数百个基本实用程序,当结合起来时,可以提供强大的功能,以高效的方式完成大型任务。
Linux理念的示例
例如,如果管理员想要列出系统上所有当前用户,可以使用以下链式命令来获取系统上所有用户的列表。执行命令后,系统上的用户将按字母顺序列出。
[root@centosLocal centos]# cut /etc/passwd -d":" -f1 | sort abrt adm avahi bin centos chrony colord daemon dbus
可以使用以下命令轻松地将此列表导出到文本文件。
[root@localhost /]# cut /etc/passwd -d ":" -f1 > system_users.txt [root@localhost /]# cat ./system_users.txt | sort | wc –l 40 [root@localhost /]#
还可以将用户列表与以后的导出进行比较。
[root@centosLocal centos]# cut /etc/passwd -d ":" -f1 > system_users002.txt && cat system_users002.txt | sort | wc -l 41 [root@centosLocal centos]# diff ./system_users.txt ./system_users002.txt evilBackdoor [root@centosLocal centos]#
通过这种使用小型工具链来完成大型任务的方法,编写执行这些命令的脚本比定期自动发送电子邮件结果要简单得多。
每个Linux管理员都应该熟练掌握的基本命令包括:
在Linux世界中,管理员每天都使用**过滤**命令来解析日志、过滤命令输出以及使用交互式shell脚本执行操作。如前所述,这些命令的功能在于它们能够通过称为**管道**的过程相互修改。
以下命令显示CentOS主用户字典中以字母a开头的单词有多少个。
[root@centosLocal ~]# egrep '^a.*$' /usr/share/dict/words | wc -l 25192 [root@centosLocal ~]#
Linux管理员 - 文件/文件夹管理
为了介绍CentOS Linux中目录和文件适用的权限,让我们看一下以下命令输出。
[centos@centosLocal etc]$ ls -ld /etc/yum* drwxr-xr-x. 6 root root 100 Dec 5 06:59 /etc/yum -rw-r--r--. 1 root root 970 Nov 15 08:30 /etc/yum.conf drwxr-xr-x. 2 root root 187 Nov 15 08:30 /etc/yum.repos.d
**注意** - 你将看到的三个主要对象类型是
**"-"** - 表示普通文件
**"d"** - 表示目录
**"l"** - 表示符号链接
我们将重点关注每个目录和文件的三个输出块:
- drwxr-xr-x : root : root
- -rw-r--r-- : root : root
- drwxr-xr-x : root : root
现在让我们分解一下,以便更好地理解这些行:
d | 表示对象类型是目录 |
rwx | 指示应用于所有者的**目录**权限 |
r-x | 指示应用于组的**目录**权限 |
r-x | 指示应用于世界的**目录**权限 |
root | 第一个实例指示目录的所有者 |
root | 第二个实例指示应用组权限的组 |
理解所有者、组和世界之间的区别非常重要。如果不理解这一点,可能会对托管互联网服务的服务器产生重大影响。
在我们给出实际示例之前,让我们首先了解应用于目录和文件的权限。
请查看下表,然后继续操作。
八进制 | 符号 | 权限 | 目录 |
---|---|---|---|
1 | x | 执行 | 进入目录并访问文件 |
2 | w | 写入 | 删除或修改目录中的文件 |
4 | r | 读取 | 列出目录中的文件 |
**注意** - 当文件应该在目录中可读时,通常会应用读取和执行权限。否则,用户将难以处理文件。禁用写入将确保无法重命名、删除、复制或修改文件权限。
将权限应用于目录和文件
应用权限时,需要理解两个概念:
- 符号权限
- 八进制权限
本质上,两者相同,只是指代和分配文件权限的方式不同。有关快速指南,请学习并参考下表:
读取 | 写入 | 执行 | |
---|---|---|---|
八进制 | 4 | 2 | 1 |
符号 | r | w | x |
使用**八进制**方法分配权限时,使用 3 字节数字,例如:760。数字 760 转换为:所有者:rwx;组:rw;其他(或世界)无权限。
另一种情况:733 将转换为:所有者:rwx;组:wx;其他:wx。
使用八进制方法设置权限有一个缺点。无法修改现有的权限集。只能重新分配对象的整个权限集。
现在你可能会想,总是重新分配权限有什么问题?想象一下大型目录结构,例如生产 Web 服务器上的`/var/www/`。我们要递归地从所有目录的“其他”用户那里移除`w` 或写入位。因此,强制只有在需要安全措施时才主动添加它。如果我们重新分配整个权限集,我们将移除分配给每个子目录的所有其他自定义权限。
因此,这将给管理员和系统用户都带来问题。在某些时候,一个人(或多个人)需要重新分配所有被重新分配每个目录和对象的整个权限集而清除的自定义权限。
在这种情况下,我们希望使用符号方法来修改权限:
chmod -R o-w /var/www/
上述命令不会“覆盖权限”,而是修改当前权限集。因此,请习惯于使用最佳实践
- 仅使用八进制分配权限
- 使用符号修改权限集
重要的是,CentOS管理员应该熟练掌握八进制和符号权限,因为权限对于数据的完整性和整个操作系统都很重要。如果权限不正确,最终结果将是敏感数据和整个操作系统都将受到损害。
在介绍完这些内容后,让我们来看一些用于修改权限和对象所有者/成员的命令:
- chmod
- chown
- chgrp
- umask
chmod:更改文件模式权限位
命令 | 操作 |
---|---|
-c | 类似于详细模式,但只会报告所做的更改 |
-v | 详细模式,输出每个请求的诊断信息 |
-R | 递归地将操作应用于文件和目录 |
chmod 将允许我们使用八进制或符号权限集更改目录和文件的权限。我们将使用它来修改我们的作业和上传目录。
chown:更改文件所有者和组
命令 | 操作 |
---|---|
-c | 类似于详细模式,但只会报告所做的更改 |
-v | 详细模式,输出每个请求的诊断信息 |
-R | 递归地将操作应用于文件和目录 |
chown 可以修改对象的所有者用户和组。但是,除非需要同时修改两者,否则通常使用 chgrp 来处理组。
chgrp:更改文件或目录的组所有权
命令 | 操作 |
---|---|
-c | 类似于详细模式,但只会报告所做的更改 |
-v | 详细模式,输出每个请求的诊断信息 |
-R | 递归地将操作应用于文件和目录 |
chgrp 将更改组所有者为提供的组。
实际操作
让我们更改`/var/www/students/`中的所有子目录作业,以便所有者组为`students`组。然后将`students`的根目录分配给`professors`组。稍后,让 Terry Thomas 博士成为`students`目录的所有者,因为他负责学校所有计算机科学方面的学术工作。
正如我们所看到的,创建目录时,目录的状态相当原始。
[root@centosLocal ~]# ls -ld /var/www/students/ drwxr-xr-x. 4 root root 40 Jan 9 22:03 /var/www/students/ [root@centosLocal ~]# ls -l /var/www/students/ total 0 drwxr-xr-x. 2 root root 6 Jan 9 22:03 assignments drwxr-xr-x. 2 root root 6 Jan 9 22:03 uploads [root@centosLocal ~]#
作为管理员,我们永远不想将我们的root权限交给任何人。但与此同时,我们需要允许用户能够完成他们的工作。因此,让我们允许 Terry Thomas 博士对文件结构进行更多控制,并限制学生可以执行的操作。
[root@centosLocal ~]# chown -R drterryt:professors /var/www/students/ [root@centosLocal ~]# ls -ld /var/www/students/ drwxr-xr-x. 4 drterryt professors 40 Jan 9 22:03 /var/www/students/ [root@centosLocal ~]# ls -ls /var/www/students/ total 0 0 drwxr-xr-x. 2 drterryt professors 6 Jan 9 22:03 assignments 0 drwxr-xr-x. 2 drterryt professors 6 Jan 9 22:03 uploads [root@centosLocal ~]#
现在,每个目录和子目录的所有者都是`drterryt`,所有者组是`professors`。由于`assignments`目录用于学生提交作业,让我们取消`students`组列出和修改文件的权限。
[root@centosLocal ~]# chgrp students /var/www/students/assignments/ && chmod 736 /var/www/students/assignments/ [root@centosLocal assignments]# ls -ld /var/www/students/assignments/ drwx-wxrw-. 2 drterryt students 44 Jan 9 23:14 /var/www/students/assignments/ [root@centosLocal assignments]#
学生可以将作业复制到`assignments`目录。但他们不能列出目录的内容、复制当前文件或修改`assignments`目录中的文件。因此,它只允许学生提交已完成的作业。CentOS文件系统将提供作业提交时间的日期戳。
作为`assignments`目录的所有者:
[drterryt@centosLocal assignments]$ whoami drterryt [drterryt@centosLocal assignments]$ ls -ld /var/www/students/assignment drwx-wxrw-. 2 drterryt students 44 Jan 9 23:14 /var/www/students/assignments/ [drterryt@centosLocal assignments]$ ls -l /var/www/students/assignments/ total 4 -rw-r--r--. 1 adama students 0 Jan 9 23:14 myassign.txt -rw-r--r--. 1 tammyr students 16 Jan 9 23:18 terryt.txt [drterryt@centosLocal assignments]$
我们可以看到,目录所有者可以列出文件以及修改和删除文件。
umask 命令:提供创建文件和目录权限时的默认模式
umask 是一个重要的命令,它为创建的文件和目录权限提供默认模式。
umask 权限使用一元反向逻辑。
权限 | 操作 |
---|---|
0 | 读、写、执行 |
1 | 读和写 |
2 | 读和执行 |
3 | 只读 |
4 | 读和执行 |
5 | 只写 |
6 | 只执行 |
7 | 无权限 |
[adama@centosLocal umask_tests]$ ls -l ./ -rw-r--r--. 1 adama students 0 Jan 10 00:27 myDir -rw-r--r--. 1 adama students 0 Jan 10 00:27 myFile.txt [adama@centosLocal umask_tests]$ whoami adama [adama@centosLocal umask_tests]$ umask 0022 [adama@centosLocal umask_tests]$
现在,让我们更改当前用户的 umask,并创建一个新的文件和目录。
[adama@centosLocal umask_tests]$ umask 077 [adama@centosLocal umask_tests]$ touch mynewfile.txt [adama@centosLocal umask_tests]$ mkdir myNewDir [adama@centosLocal umask_tests]$ ls -l total 0 -rw-r--r--. 1 adama students 0 Jan 10 00:27 myDir -rw-r--r--. 1 adama students 0 Jan 10 00:27 myFile.txt drwx------. 2 adama students 6 Jan 10 00:35 myNewDir -rw-------. 1 adama students 0 Jan 10 00:35 mynewfile.txt
我们可以看到,新创建的文件比以前更严格了一些。
必须更改用户的 umask,方法如下:
- /etc/profile
- ~/bashrc
[root@centosLocal centos]# su adama [adama@centosLocal centos]$ umask 0022 [adama@centosLocal centos]$
通常,CentOS 中的默认 umask 就足够了。当我们遇到默认值为 0022 的问题时,通常是因为不同部门的不同组需要协作完成项目。
这就是系统管理员的作用所在,需要平衡 CentOS 操作系统的操作和设计。
Linux管理员 - 用户管理
在讨论用户管理时,我们需要理解三个重要术语:
- 用户
- 组
- 权限
我们已经深入讨论了应用于文件和文件夹的权限。在本章中,让我们讨论用户和组。
CentOS 用户
在 CentOS 中,有两种类型的帐户:
系统帐户 - 用于守护进程或其他软件。
交互式帐户 - 通常分配给用户以访问系统资源。
这两种用户类型的主要区别在于:
系统帐户 由守护进程用来访问文件和目录。这些帐户通常不允许通过 shell 或物理控制台登录进行交互式登录。
交互式帐户 由最终用户用来通过 shell 或物理控制台登录访问计算资源。
有了对用户的基本了解,现在让我们为会计部门的 Bob Jones 创建一个新用户。使用 adduser 命令添加新用户。
以下是 adduser 常用开关:
开关 | 操作 |
---|---|
-c | 向用户帐户添加注释 |
-m | 如果不存在,则在默认位置创建用户主目录 |
-g | 分配给用户的默认组 |
-n | 不为用户创建专用组,通常是用户名组 |
-M | 不创建主目录 |
-s | 除 /bin/bash 之外的默认 shell |
-u | 指定 UID(否则由系统分配) |
-G | 分配给用户的附加组 |
创建新用户时,请按如下方式使用 -c, -m, -g, -n 开关:
[root@localhost Downloads]# useradd -c "Bob Jones Accounting Dept Manager" -m -g accounting -n bjones
现在让我们看看新用户是否已创建:
[root@localhost Downloads]# id bjones (bjones) gid = 1001(accounting) groups = 1001(accounting) [root@localhost Downloads]# grep bjones /etc/passwd bjones:x:1001:1001:Bob Jones Accounting Dept Manager:/home/bjones:/bin/bash [root@localhost Downloads]#
现在我们需要使用 passwd 命令启用新帐户:
[root@localhost Downloads]# passwd bjones Changing password for user bjones. New password: Retype new password: passwd: all authentication tokens updated successfully. [root@localhost Downloads]#
用户帐户未启用,不允许用户登录系统。
禁用用户帐户
有多种方法可以禁用系统上的帐户。这些方法范围从手动编辑 /etc/passwd 文件,甚至使用带有 -l 开关的 passwd 命令。这两种方法都有一个很大的缺点:如果用户具有 ssh 访问权限并使用 RSA 密钥进行身份验证,他们仍然可以使用此方法登录。
现在让我们使用 chage 命令,将密码过期日期更改为之前的日期。此外,最好在帐户中记下我们禁用它的原因。
[root@localhost Downloads]# chage -E 2005-10-01 bjones [root@localhost Downloads]# usermod -c "Disabled Account while Bob out of the country for five months" bjones [root@localhost Downloads]# grep bjones /etc/passwd bjones:x:1001:1001:Disabled Account while Bob out of the country for four months:/home/bjones:/bin/bash [root@localhost Downloads]#
管理组
在 Linux 中管理组使管理员可以方便地将用户组合到容器中,并应用适用于所有组成员的权限集。例如,会计部门的所有用户可能都需要访问相同的文件。因此,我们创建一个会计组,并添加会计用户。
在大多数情况下,任何需要特殊权限的操作都应该在组内完成。这种方法通常比只对一个用户应用特殊权限更省时。例如,Sally 负责报告,只有 Sally 需要访问某些用于报告的文件。但是,如果 Sally 有一天生病了,Bob 也要制作报告怎么办?或者报告的需求增加了怎么办?创建一个组后,管理员只需执行一次即可。添加用户会根据需要进行更改或扩展。
以下是用于管理组的一些常用命令:
- chgrp
- groupadd
- groups
- usermod
chgrp - 更改文件或目录的组所有权。
让我们为会计组中的人员创建一个目录,用于存储文件和创建文件目录。
[root@localhost Downloads]# mkdir /home/accounting [root@localhost Downloads]# ls -ld /home/accounting drwxr-xr-x. 2 root root 6 Jan 13 10:18 /home/accounting [root@localhost Downloads]#
接下来,让我们将组所有权授予会计组。
[root@localhost Downloads]# chgrp -v accounting /home/accounting/ changed group of ‘/home/accounting/’ from root to accounting [root@localhost Downloads]# ls -ld /home/accounting/ drwxr-xr-x. 2 root accounting 6 Jan 13 10:18 /home/accounting/ [root@localhost Downloads]#
现在,会计组中的每个人都对/home/accounting具有读取和执行权限。他们也需要写入权限。
[root@localhost Downloads]# chmod g+w /home/accounting/ [root@localhost Downloads]# ls -ld /home/accounting/ drwxrwxr-x. 2 root accounting 6 Jan 13 10:18 /home/accounting/ [root@localhost Downloads]#
由于会计组可能处理敏感文档,我们需要对其他用户或世界用户应用一些限制性权限。
[root@localhost Downloads]# chmod o-rx /home/accounting/ [root@localhost Downloads]# ls -ld /home/accounting/ drwxrwx---. 2 root accounting 6 Jan 13 10:18 /home/accounting/ [root@localhost Downloads]#
groupadd - 用于创建一个新组。
开关 | 操作 |
---|---|
-g | 为组指定 GID |
-K | 覆盖 /etc/login.defs 中 GID 的规范 |
-o | 允许覆盖非唯一组 ID 不允许 |
-p | 组密码,允许用户自行激活 |
让我们创建一个名为 secret 的新组。我们将向组添加密码,允许用户使用已知密码添加自己。
[root@localhost]# groupadd secret [root@localhost]# gpasswd secret Changing the password for group secret New Password: Re-enter new password: [root@localhost]# exit exit [centos@localhost ~]$ newgrp secret Password: [centos@localhost ~]$ groups secret wheel rdc [centos@localhost ~]$
实际上,组密码很少使用。辅助组就足够了,在其他用户之间共享密码并不是一个很好的安全做法。
groups 命令用于显示用户属于哪个组。我们将在对当前用户进行一些更改后使用它。
usermod 用于更新帐户属性。
以下是常见的 usermod 开关。
开关 | 操作 |
---|---|
-a | 追加,仅使用 -G 选项将用户添加到辅助组 |
-c | 注释,更新用户注释值 |
-d | 主目录,更新用户的主目录 |
-G | 组,添加或删除辅助用户组 |
-g | 组,用户的默认主组 |
[root@localhost]# groups centos centos : accounting secret [root@localhost]# [root@localhost]# usermod -a -G wheel centos [root@localhost]# groups centos centos : accounting wheel secret [root@localhost]#
Linux管理员 - 配额管理
CentOS 磁盘配额既可以启用;在磁盘容量超过限制之前提醒系统管理员并拒绝用户进一步访问磁盘存储。当磁盘已满时,根据磁盘上存放的内容,整个系统可能会完全停止运行,直到恢复为止。
在 CentOS Linux 中启用配额管理基本上是一个 4 步过程:
步骤 1 - 在 /etc/fstab 中为组和用户启用配额管理。
步骤 2 - 重新挂载文件系统。
步骤 3 - 创建配额数据库并生成磁盘使用情况表。
步骤 4 - 分配配额策略。
在 /etc/fstab 中启用配额管理
首先,我们要备份我们的 /etc/fstab 文件:
[root@centosLocal centos]# cp -r /etc/fstab ./
现在我们在当前工作目录中有了已知工作/etc/fstab的副本。
# # /etc/fstab # Created by anaconda on Sat Dec 17 02:44:51 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/cl-root / xfs defaults 0 0 UUID = 4b9a40bc-9480-4 /boot xfs defaults 0 0 /dev/mapper/cl-home /home xfs defaults,usrquota,grpquota 0 0 /dev/mapper/cl-swap swap swap defaults 0 0
我们在要为用户和组应用配额的卷或标签的/etc/fstab选项部分进行了以下更改。
- usrquota
- grpquota
如您所见,我们使用的是xfs文件系统。使用 xfs 时,会涉及额外的步骤。/home与 / 在同一磁盘上。进一步调查显示 / 设置为 noquota,这是一个内核级挂载选项。我们必须重新配置内核引导选项。
root@localhost rdc]# mount | grep ' / ' /dev/mapper/cl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota) [root@localhost rdc]#
重新配置 XFS 文件系统的内核引导选项
此步骤仅在以下两种情况下才需要:
- 当我们正在启用配额的磁盘/分区使用 xfs 文件系统时
- 当内核在引导时将 noquota 参数传递给 /etc/fstab 时
步骤 1 - 备份 /etc/default/grub。
cp /etc/default/grub ~/
步骤 2 - 修改/etc/default/grub。
这是默认文件。
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet" GRUB_DISABLE_RECOVERY="true"
我们要修改以下行:
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"
为
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv =cl/swap rhgb quiet rootflags=usrquota,grpquota"
注意 - 正确复制这些更改非常重要。重新配置 grub.cfg 后,如果配置中出现任何错误,我们的系统将无法启动。请在非生产系统上尝试本教程的这一部分。
步骤 3 - 备份您的工作 grub.cfg
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
创建一个新的 grub.cfg
[root@localhost rdc]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-dbba7fa47f73457b96628ba8f3959bfd Found initrd image: /boot/initramfs-0-rescuedbba7fa47f73457b96628ba8f3959bfd.img done [root@localhost rdc]#
重启
[root@localhost rdc]#reboot
如果所有修改都准确无误,我们就不应该能够向 xfs 文件系统添加配额了。
[rdc@localhost ~]$ mount | grep ' / ' /dev/mapper/cl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota) [rdc@localhost ~]$
我们已经通过 grub 传递了 usrquota 和 grpquota 参数。
现在,再次编辑/etc/fstab以包含 /,因为/home在同一物理磁盘上。
/dev/mapper/cl-root/xfs defaults,usrquota,grpquota 0 0
现在让我们启用配额数据库。
[root@localhost rdc]# quotacheck -acfvugM
确保已启用配额。
[root@localhost rdc]# quotaon -ap group quota on / (/dev/mapper/cl-root) is on user quota on / (/dev/mapper/cl-root) is on group quota on /home (/dev/mapper/cl-home) is on user quota on /home (/dev/mapper/cl-home) is on [root@localhost rdc]#
重新挂载文件系统
如果分区或磁盘与正在主动引导的分区分开,我们可以无需重新引导即可重新挂载。如果在根目录 / 中引导的磁盘/分区上配置了配额,则可能需要重新引导操作系统。强制重新挂载并应用更改,重新挂载文件系统的需要可能会有所不同。
[rdc@localhost ~]$ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/cl-root 22447404 4081860 18365544 19% / devtmpfs 903448 0 903448 0% /dev tmpfs 919308 100 919208 1% /dev/shm tmpfs 919308 9180 910128 1% /run tmpfs 919308 0 919308 0% /sys/fs/cgroup /dev/sda2 1268736 176612 1092124 14% /boot /dev/mapper/cl-var 4872192 158024 4714168 4% /var /dev/mapper/cl-home 18475008 37284 18437724 1% /home tmpfs 183864 8 183856 1% /run/user/1000 [rdc@localhost ~]$
我们可以看到,正在使用 LVM 卷。因此,只需重新引导即可。这将重新挂载/home并将/etc/fstab配置更改加载到活动配置中。
创建配额数据库文件
CentOS 现在能够使用 /home 上的磁盘配额。要启用完全配额支持,我们必须运行quotacheck命令。
quotacheck 将创建两个文件:
- aquota.user
- aquota.group
这些文件用于存储已启用配额的磁盘/分区的配额信息。
以下是常见的 quotacheck 开关。
开关 | 操作 |
---|---|
-u | 检查用户配额 |
-g | 检查组配额 |
-c | 应为每个启用配额的文件系统启用配额 |
-v | 显示详细输出 |
添加每个用户的配额限制
为此,我们将使用 edquota 命令,后跟用户名:
[root@localhost rdc]# edquota centos Disk quotas for user centos (uid 1000): Filesystem blocks soft hard inodes soft hard /dev/mapper/cl-root 12 0 0 13 0 0 /dev/mapper/cl-home 4084 0 0 140 0 0
让我们看看每一列。
文件系统 - 这是应用于用户的每个文件系统的配额。
块 - 用户当前在每个文件系统上使用的块数。
软限制 - 设置软限制的块数。软限制允许用户在给定时间段内使用配额。
硬限制 - 设置硬限制的块数。硬限制是允许的总配额。
inode - 用户当前使用的 inode 数。
软限制 - 软 inode 限制。
硬限制 - 硬 inode 限制。
要检查我们当前用户的配额:
[centos@localhost ~]$ quota Disk quotas for user centos (uid 1000): Filesystem blocks quota limit grace files quota limit grace /dev/mapper/cl-home 6052604 56123456 61234568 475 0 0 [centos@localhost ~]$
以下是当用户超过硬配额限制时给出的错误。
[centos@localhost Downloads]$ cp CentOS-7-x86_64-LiveKDE-1611.iso.part ../Desktop/ cp: cannot create regular file ‘../Desktop/CentOS-7-x86_64-LiveKDE- 1611.iso.part’: Disk quota exceeded [centos@localhost Downloads]$
我们可以看到,我们非常接近此用户的磁盘配额。让我们设置一个软限制警告。这样,用户在配额限制过期前将收到预先通知。根据经验,当用户上班时需要花费 45 分钟来清除文件才能真正开始工作时,您会收到最终用户的投诉。
作为管理员,我们可以使用repquota命令检查配额使用情况。
[root@localhost Downloads]# repquota /home Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------------------------- root -- 0 0 0 3 0 0 centos -+ 6189824 56123456 61234568 541 520 540 6days [root@localhost Downloads]#
我们可以看到,centos 用户已超过其硬块配额,并且不能再在/home上使用任何磁盘空间了。
-+ 表示文件系统上的硬配额已超过。
规划配额时,需要进行一些计算。管理员需要知道:系统上有多少用户?如何在用户/组之间分配可用空间?文件系统上的一个块包含多少字节?
根据可用磁盘空间定义以块为单位的配额。建议在文件系统上保留一个“安全”的空闲空间缓冲区,即使在最坏的情况下:所有配额同时超出,这个缓冲区也能保持空闲。这尤其适用于系统用于写入日志的分区。
Systemd服务的启动和停止
systemd是运行Linux服务的新的方式。systemd已经取代了sysvinit。systemd为Linux带来了更快的启动时间,现在已成为管理Linux服务的标准方式。虽然稳定,但systemd仍在不断发展。
systemd作为初始化系统,用于管理在Linux内核启动后需要状态更改的服务和守护进程。状态更改包括启动、停止、重新加载和调整服务状态。
首先,让我们检查当前在服务器上运行的systemd版本。
[centos@localhost ~]$ systemctl --version systemd 219 +PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN [centos@localhost ~]$
截至本文撰写时,CentOS 7版本已完全更新,systemd版本219是当前的稳定版本。
我们还可以使用systemd-analyze分析上次服务器启动时间。
[centos@localhost ~]$ systemd-analyze Startup finished in 1.580s (kernel) + 908ms (initrd) + 53.225s (userspace) = 55.713s [centos@localhost ~]$
当系统启动时间较慢时,我们可以使用systemd-analyze blame命令。
[centos@localhost ~]$ systemd-analyze blame 40.882s kdump.service 5.775s NetworkManager-wait-online.service 4.701s plymouth-quit-wait.service 3.586s postfix.service 3.121s systemd-udev-settle.service 2.649s tuned.service 1.848s libvirtd.service 1.437s network.service 875ms packagekit.service 855ms gdm.service 514ms firewalld.service 438ms rsyslog.service 436ms udisks2.service 398ms sshd.service 360ms boot.mount 336ms polkit.service 321ms accounts-daemon.service
在使用systemd时,了解单元的概念非常重要。单元是systemd知道如何解释的资源。单元分为以下12种类型:
- .service
- .socket
- .device
- .mount
- .automount
- .swap
- .target
- .path
- .timer
- .snapshot
- .slice
- .scope
在大多数情况下,我们将使用.service作为单元目标。建议进一步研究其他类型,因为只有.service单元适用于启动和停止systemd服务。
每个单元都在以下位置的文件中定义:
/lib/systemd/system − 基本单元文件
/etc/systemd/system − 运行时启动的修改后的单元文件
使用systemctl管理服务
要使用systemd,我们需要非常熟悉systemctl命令。以下是systemctl最常用的命令行开关。
开关 | 操作 |
---|---|
-t | 单元类型的逗号分隔值,例如service或socket |
-a | 显示所有已加载的单元 |
--state | 显示处于已定义状态的所有单元,例如:load、sub、active、inactive等。 |
-H | 远程执行操作。指定主机名或主机名和用户名,用@分隔。 |
基本的systemctl用法
systemctl [operation] example: systemctl --state [servicename.service]
快速查看我们系统上运行的所有服务。
[root@localhost rdc]# systemctl -t service UNIT LOAD ACTIVE SUB DESCRIPTION abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-xorg.service loaded active running ABRT Xorg log watcher abrtd.service loaded active running ABRT Automated Bug Reporting Tool accounts-daemon.service loaded active running Accounts Service alsa-state.service loaded active running Manage Sound Card State (restore and store) atd.service loaded active running Job spooling tools auditd.service loaded active running Security Auditing Service avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack blk-availability.service loaded active exited Availability of block devices bluetooth.service loaded active running Bluetooth service chronyd.service loaded active running NTP client/server
停止服务
首先,让我们停止蓝牙服务。
[root@localhost]# systemctl stop bluetooth [root@localhost]# systemctl --all -t service | grep bluetooth bluetooth.service loaded inactive dead Bluetooth service [root@localhost]#
我们可以看到,蓝牙服务现在处于非活动状态。
要再次启动蓝牙服务。
[root@localhost]# systemctl start bluetooth [root@localhost]# systemctl --all -t service | grep bluetooth bluetooth.service loaded active running Bluetooth service [root@localhost]#
注意 − 我们没有指定bluetooth.service,因为.service是隐含的。最好将单元类型添加到我们正在处理的服务中。因此,从现在开始,我们将使用.service扩展名来明确我们正在执行服务单元操作。
可以对服务执行的主要操作包括:
Start | 启动服务 |
Stop | 停止服务 |
Reload | 重新加载服务的活动配置,无需停止它(类似于system v init中的kill -HUP) |
Restart | 启动然后停止服务 |
Enable | 在启动时启动服务 |
Disable | 阻止服务在运行时自动启动 |
上述操作主要用于以下场景:
Start | 启动已停止的服务。 |
Stop | 临时关闭服务(例如,当必须停止服务才能访问服务锁定的文件时,例如升级服务时)。 |
Reload | 编辑配置文件后,我们希望应用新更改而不停止服务。 |
Restart | 与重新加载相同的场景,但服务不支持重新加载。 |
Enable | 当我们希望在启动时运行禁用的服务时。 |
Disable | 主要用于需要停止服务但它在启动时启动的情况。 |
检查服务状态:
[root@localhost]# systemctl status network.service network.service - LSB: Bring up/down networking Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled) Active: active (exited) since Sat 2017-01-14 04:43:48 EST; 1min 31s ago Docs: man:systemd-sysv-generator(8) Process: 923 ExecStart = /etc/rc.d/init.d/network start (code=exited, status = 0/SUCCESS) localhost.localdomain systemd[1]: Starting LSB: Bring up/down networking... localhost.localdomain network[923]: Bringing up loopback interface: [ OK ] localhost.localdomain systemd[1]: Started LSB: Bring up/down networking. [root@localhost]#
向我们显示networking服务的当前状态。如果我们想查看与网络相关的所有服务,我们可以使用:
[root@localhost]# systemctl --all -t service | grep -i network network.service loaded active exited LSB: Bring up/ NetworkManager-wait-online.service loaded active exited Network Manager NetworkManager.service loaded active running Network Manager ntpd.service loaded inactive dead Network Time rhel-import-state.service loaded active exited Import network [root@localhost]#
对于熟悉sysinit服务管理方法的人来说,过渡到systemd非常重要。systemd是在Linux中启动和停止守护进程服务的新方法。
Linux管理员 - 使用systemctl进行资源管理
systemctl是用于控制systemd的实用程序。systemctl使CentOS管理员能够对systemd执行多种操作,包括:
- 配置systemd单元
- 获取systemd单元的状态
- 启动和停止服务
- 启用/禁用systemd服务以进行运行时等操作。
systemctl的命令语法非常简单,但可能会与开关和选项纠缠在一起。我们将介绍管理CentOS Linux所需的systemctl最基本的功能。
Basic systemctl syntax: systemctl [OPTIONS] COMMAND [NAME]
以下是与systemctl一起使用的常用命令:
- start
- stop
- restart
- reload
- status
- is-active
- list-units
- enable
- disable
- cat
- show
我们已经讨论了start、stop、reload、restart、enable和disable以及systemctl。所以让我们回顾一下其余常用的命令。
status
在最简单的形式中,status命令可用于查看整个系统的状态:
[root@localhost rdc]# systemctl status ● localhost.localdomain State: running Jobs: 0 queued Failed: 0 units Since: Thu 2017-01-19 19:14:37 EST; 4h 5min ago CGroup: / ├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 ├─user.slice │ └─user-1002.slice │ └─session-1.scope │ ├─2869 gdm-session-worker [pam/gdm-password] │ ├─2881 /usr/bin/gnome-keyring-daemon --daemonize --login │ ├─2888 gnome-session --session gnome-classic │ ├─2895 dbus-launch --sh-syntax --exit-with-session
上面的输出已被压缩。在实际应用中,systemctl status将输出大约100行树状进程状态。
假设我们要检查防火墙服务的状况:
[root@localhost rdc]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2017-01-19 19:14:55 EST; 4h 12min ago Docs: man:firewalld(1) Main PID: 825 (firewalld) CGroup: /system.slice/firewalld.service └─825 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
正如你所看到的,我们的防火墙服务当前处于活动状态,并且已经运行了超过4个小时。
list-units
list-units命令允许我们列出特定类型的所有单元。让我们检查由systemd管理的套接字:
[root@localhost]# systemctl list-units --type=socket UNIT LOAD ACTIVE SUB DESCRIPTION avahi-daemon.socket loaded active running Avahi mDNS/DNS-SD Stack Activation Socket cups.socket loaded active running CUPS Printing Service Sockets dbus.socket loaded active running D-Bus System Message Bus Socket dm-event.socket loaded active listening Device-mapper event daemon FIFOs iscsid.socket loaded active listening Open-iSCSI iscsid Socket iscsiuio.socket loaded active listening Open-iSCSI iscsiuio Socket lvm2-lvmetad.socket loaded active running LVM2 metadata daemon socket lvm2-lvmpolld.socket loaded active listening LVM2 poll daemon socket rpcbind.socket loaded active listening RPCbind Server Activation Socket systemd-initctl.socket loaded active listening /dev/initctl Compatibility Named Pipe systemd-journald.socket loaded active running Journal Socket systemd-shutdownd.socket loaded active listening Delayed Shutdown Socket systemd-udevd-control.socket loaded active running udev Control Socket systemd-udevd-kernel.socket loaded active running udev Kernel Socket virtlockd.socket loaded active listening Virtual machine lock manager socket virtlogd.socket loaded active listening Virtual machine log manager socket
现在让我们检查当前正在运行的服务:
[root@localhost rdc]# systemctl list-units --type=service UNIT LOAD ACTIVE SUB DESCRIPTION abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-xorg.service loaded active running ABRT Xorg log watcher abrtd.service loaded active running ABRT Automated Bug Reporting Tool accounts-daemon.service loaded active running Accounts Service alsa-state.service loaded active running Manage Sound Card State (restore and store) atd.service loaded active running Job spooling tools auditd.service loaded active running Security Auditing Service
is-active
is-active命令是systemctl命令的一个示例,旨在返回单元的状态信息。
[root@localhost rdc]# systemctl is-active ksm.service active
cat
cat是一个很少使用的命令。无需在shell中使用cat并键入单元文件的路径,只需使用systemctl cat。
[root@localhost]# systemctl cat firewalld # /usr/lib/systemd/system/firewalld.service [Unit] Description=firewalld - dynamic firewall daemon Before=network.target Before=libvirtd.service Before = NetworkManager.service After=dbus.service After=polkit.service Conflicts=iptables.service ip6tables.service ebtables.service ipset.service Documentation=man:firewalld(1) [Service] EnvironmentFile = -/etc/sysconfig/firewalld ExecStart = /usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS ExecReload = /bin/kill -HUP $MAINPID # supress to log debug and error output also to /var/log/messages StandardOutput = null StandardError = null Type = dbus BusName = org.fedoraproject.FirewallD1 [Install] WantedBy = basic.target Alias = dbus-org.fedoraproject.FirewallD1.service [root@localhost]#
现在我们已经更详细地探讨了systemd和systemctl,让我们使用它们来管理cgroups或控制组中的资源。
Linux管理员 - 使用crgoups进行资源管理
cgroups或控制组是Linux内核的一项功能,允许管理员为服务和组分配或限制系统资源。
要列出正在运行的活动控制组,我们可以使用以下ps命令:
[root@localhost]# ps xawf -eo pid,user,cgroup,args 8362 root - \_ [kworker/1:2] 1 root - /usr/lib/systemd/systemd --switched- root --system -- deserialize 21 507 root 7:cpuacct,cpu:/system.slice /usr/lib/systemd/systemd-journald 527 root 7:cpuacct,cpu:/system.slice /usr/sbin/lvmetad -f 540 root 7:cpuacct,cpu:/system.slice /usr/lib/systemd/systemd-udevd 715 root 7:cpuacct,cpu:/system.slice /sbin/auditd -n 731 root 7:cpuacct,cpu:/system.slice \_ /sbin/audispd 734 root 7:cpuacct,cpu:/system.slice \_ /usr/sbin/sedispatch 737 polkitd 7:cpuacct,cpu:/system.slice /usr/lib/polkit-1/polkitd --no-debug 738 rtkit 6:memory:/system.slice/rtki /usr/libexec/rtkit-daemon 740 dbus 7:cpuacct,cpu:/system.slice /bin/dbus-daemon --system -- address=systemd: --nofork --nopidfile --systemd-activation
截至CentOS 6.X,资源管理已通过systemd init实现重新定义。在考虑服务的资源管理时,主要关注的是cgroups。cgroups在功能和简易性方面都随着systemd的改进而得到提升。
cgroups在资源管理中的目标是 - 任何服务都不能使整个系统崩溃。或者没有单个服务进程(可能是编写不当的PHP脚本)会通过消耗过多资源来削弱服务器功能。
cgroups允许对以下资源的单元进行资源控制:
CPU − 限制不重要的CPU密集型任务,与其他不太密集的任务相比
内存 − 限制服务可以消耗的内存量
磁盘 − 限制磁盘I/O
**CPU时间:**
需要较低CPU优先级的任务可以具有自定义配置的CPU时间片。
让我们以以下两个服务为例。
礼貌的CPU服务1
[root@localhost]# systemctl cat polite.service # /etc/systemd/system/polite.service [Unit] Description = Polite service limits CPU Slice and Memory After=remote-fs.target nss-lookup.target [Service] MemoryLimit = 1M ExecStart = /usr/bin/sha1sum /dev/zero ExecStop = /bin/kill -WINCH ${MAINPID} WantedBy=multi-user.target # /etc/systemd/system/polite.service.d/50-CPUShares.conf [Service] CPUShares = 1024 [root@localhost]#
邪恶的CPU服务2
[root@localhost]# systemctl cat evil.service # /etc/systemd/system/evil.service [Unit] Description = I Eat You CPU After=remote-fs.target nss-lookup.target [Service] ExecStart = /usr/bin/md5sum /dev/zero ExecStop = /bin/kill -WINCH ${MAINPID} WantedBy=multi-user.target # /etc/systemd/system/evil.service.d/50-CPUShares.conf [Service] CPUShares = 1024 [root@localhost]#
让我们使用较低的CPU优先级设置礼貌服务:
systemctl set-property polite.service CPUShares = 20 /system.slice/polite.service 1 70.5 124.0K - - /system.slice/evil.service 1 99.5 304.0K - -
我们可以看到,在正常的系统空闲时间内,两个流氓进程仍在使用CPU周期。但是,设置为具有较少时间片的进程使用的CPU时间较少。考虑到这一点,我们可以看到使用较少的时间片将如何允许基本任务更好地访问系统资源。
要为每个资源设置服务,set-property方法定义以下参数:
systemctl set-property name parameter=value
CPU时间片 | CPUShares |
内存限制 | MemoryLimit |
软内存限制 | MemorySoftLimit |
块IO权重 | BlockIOWeight |
块设备限制(在/volume/path中指定) | BlockIODeviceWeight |
读取IO | BlockIOReadBandwidth |
磁盘写入IO | BlockIOReadBandwidth |
服务最常受到CPU使用率、内存限制和读/写IO的限制。
更改每个参数后,需要重新加载systemd并重新启动服务:
systemctl set-property foo.service CPUShares = 250 systemctl daemon-reload systemctl restart foo.service
在CentOS Linux中配置CGroups
要在CentOS Linux中创建自定义cgroups,我们需要首先安装服务并对其进行配置。
步骤1 − 安装libcgroup(如果尚未安装)。
[root@localhost]# yum install libcgroup Package libcgroup-0.41-11.el7.x86_64 already installed and latest version Nothing to do [root@localhost]#
我们可以看到,默认情况下,CentOS 7已使用everything安装程序安装了libcgroup。使用最小安装程序将需要我们安装libcgroup实用程序以及任何依赖项。
步骤2 − 启动并启用cgconfig服务。
[root@localhost]# systemctl enable cgconfig Created symlink from /etc/systemd/system/sysinit.target.wants/cgconfig.service to /usr/lib/systemd/system/cgconfig.service. [root@localhost]# systemctl start cgconfig [root@localhost]# systemctl status cgconfig ● cgconfig.service - Control Group configuration service Loaded: loaded (/usr/lib/systemd/system/cgconfig.service; enabled; vendor preset: disabled) Active: active (exited) since Mon 2017-01-23 02:51:42 EST; 1min 21s ago Main PID: 4692 (code=exited, status = 0/SUCCESS) Memory: 0B CGroup: /system.slice/cgconfig.service Jan 23 02:51:42 localhost.localdomain systemd[1]: Starting Control Group configuration service... Jan 23 02:51:42 localhost.localdomain systemd[1]: Started Control Group configuration service. [root@localhost]#
Linux管理员 - 进程管理
以下是与进程管理一起使用的常用命令:bg、fg、nohup、ps、pstree、top、kill、killall、free、uptime、nice。
使用进程
快速说明:Linux中的进程PID
在Linux中,每个运行的进程都会被赋予一个PID或进程ID号。这个PID是CentOS识别特定进程的方式。正如我们所讨论的,systemd是CentOS中启动的第一个进程,其PID为1。
Pgrep用于获取给定进程名的Linux PID。
[root@CentOS]# pgrep systemd 1 [root@CentOS]#
如上所示,pgrep命令返回systemd的当前PID。
CentOS中基本的CentOS进程和作业管理
在Linux中使用进程时,重要的是要知道如何在命令行执行基本的后台和前台进程。
fg − 将进程置于前台
bg − 将进程移至后台
jobs − 附加到shell的当前进程列表
ctrl+z − Control + z键组合可使当前进程休眠
& − 在后台启动进程
让我们开始使用shell命令sleep。sleep将按其名称执行操作,休眠一段时间:sleep。
[root@CentOS ~]$ jobs [root@CentOS ~]$ sleep 10 & [1] 12454 [root@CentOS ~]$ sleep 20 & [2] 12479 [root@CentOS ~]$ jobs [1]- Running sleep 10 & [2]+ Running sleep 20 & [cnetos@CentOS ~]$
现在,让我们将第一个作业置于前台:
[root@CentOS ~]$ fg 1 sleep 10
如果你正在按照操作步骤进行,你会注意到前台作业卡在你的shell中。现在,让我们使进程休眠,然后在后台重新启用它。
- 按control+z
- 键入:bg 1,将第一个作业发送到后台并启动它。
[root@CentOS ~]$ fg 1 sleep 20 ^Z [1]+ Stopped sleep 20 [root@CentOS ~]$ bg 1 [1]+ sleep 20 & [root@CentOS ~]$
nohup
从shell或终端工作时,值得注意的是,默认情况下,附加到shell的所有进程和作业将在shell关闭或用户注销时终止。使用nohup时,如果用户注销或关闭附加进程的shell,则进程将继续运行。
[root@CentOS]# nohup ping www.google.com & [1] 27299 nohup: ignoring input and appending output to ‘nohup.out’ [root@CentOS]# pgrep ping 27299 [root@CentOS]# kill -KILL `pgrep ping` [1]+ Killed nohup ping www.google.com [root@CentOS rdc]# cat nohup.out PING www.google.com (216.58.193.68) 56(84) bytes of data. 64 bytes from sea15s07-in-f4.1e100.net (216.58.193.68): icmp_seq = 1 ttl = 128 time = 51.6 ms 64 bytes from sea15s07-in-f4.1e100.net (216.58.193.68): icmp_seq = 2 ttl = 128 time = 54.2 ms 64 bytes from sea15s07-in-f4.1e100.net (216.58.193.68): icmp_seq = 3 ttl = 128 time = 52.7 ms
ps命令
ps 命令通常由管理员用来查看特定进程的快照。ps 命令通常与 grep 命令一起使用,用于筛选和分析特定进程。
[root@CentOS ~]$ ps axw | grep python 762 ? Ssl 0:01 /usr/bin/python -Es /usr/sbin/firewalld --nofork -nopid 1296 ? Ssl 0:00 /usr/bin/python -Es /usr/sbin/tuned -l -P 15550 pts/0 S+ 0:00 grep --color=auto python
在上述命令中,我们看到了所有使用 python 解释器的进程。结果中还包括我们的 grep 命令,用于查找字符串 python。
以下是 ps 命令最常用的命令行开关。
开关 | 操作 |
---|---|
a | 不限制仅报告当前用户的进程 |
x | 显示未附加到 tty 或 shell 的进程 |
w | 以宽格式显示输出 |
e | 显示命令后的环境变量 |
-e | 选择所有进程 |
-o | 用户自定义格式的输出 |
-u | 显示特定用户的全部进程 |
-C | 按名称或进程 ID 显示所有进程 |
--sort | 按定义对进程进行排序 |
查看 nobody 用户正在使用的所有进程:
[root@CentOS ~]$ ps -u nobody PID TTY TIME CMD 1853 ? 00:00:00 dnsmasq [root@CentOS ~]$
查看 firewalld 进程的所有信息:
[root@CentOS ~]$ ps -wl -C firewalld F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 0 762 1 0 80 0 - 81786 poll_s ? 00:00:01 firewalld [root@CentOS ~]$
让我们看看哪些进程消耗的内存最多:
[root@CentOS ~]$ ps aux --sort=-pmem | head -10 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND cnetos 6130 0.7 5.7 1344512 108364 ? Sl 02:16 0:29 /usr/bin/gnome-shell cnetos 6449 0.0 3.4 1375872 64440 ? Sl 02:16 0:00 /usr/libexec/evolution-calendar-factory root 5404 0.6 2.1 190256 39920 tty1 Ssl+ 02:15 0:27 /usr/bin/Xorg :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-iDefCt/database -seat seat0 -nolisten tcp vt1 cnetos 6296 0.0 1.7 1081944 32136 ? Sl 02:16 0:00 /usr/libexec/evolution/3.12/evolution-alarm-notify cnetos 6350 0.0 1.5 560728 29844 ? Sl 02:16 0:01 /usr/bin/prlsga cnetos 6158 0.0 1.4 1026956 28004 ? Sl 02:16 0:00 /usr/libexec/gnome-shell-calendar-server cnetos 6169 0.0 1.4 1120028 27576 ? Sl 02:16 0:00 /usr/libexec/evolution-source-registry root 762 0.0 1.4 327144 26724 ? Ssl 02:09 0:01 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid cnetos 6026 0.0 1.4 1090832 26376 ? Sl 02:16 0:00 /usr/libexec/gnome-settings-daemon [root@CentOS ~]$
查看 centos 用户的所有进程,并以自定义格式显示输出:
[cnetos@CentOS ~]$ ps -u cnetos -o pid,uname,comm PID USER COMMAND 5802 centos gnome-keyring-d 5812 cnetos gnome-session 5819 cnetos dbus-launch 5820 cnetos dbus-daemon 5888 cnetos gvfsd 5893 cnetos gvfsd-fuse 5980 cnetos ssh-agent 5996 cnetos at-spi-bus-laun
pstree 命令
pstree 命令类似于 ps 命令,但使用频率较低。它以更清晰的树状方式显示进程。
[centos@CentOS ~]$ pstree systemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager─┬─dhclient │ └─2*[{NetworkManager}] ├─2*[abrt-watch-log] ├─abrtd ├─accounts-daemon───2*[{accounts-daemon}] ├─alsactl ├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon} │ └─3*[{at-spi-bus-laun}] ├─at-spi2-registr───2*[{at-spi2-registr}] ├─atd ├─auditd─┬─audispd─┬─sedispatch │ │ └─{audispd} │ └─{auditd} ├─avahi-daemon───avahi-daemon ├─caribou───2*[{caribou}] ├─cgrulesengd ├─chronyd ├─colord───2*[{colord}] ├─crond ├─cupsd
pstree 命令的总输出可能超过 100 行。通常情况下,ps 命令会提供更有用的信息。
top 命令
top 是在 Linux 系统中排查性能问题时最常用的命令之一。它对于实时统计和 Linux 系统中的进程监控非常有用。以下是 top 命令在命令行中启动后的默认输出。
Tasks: 170 total, 1 running, 169 sleeping, 0 stopped, 0 zombie %Cpu(s): 2.3 us, 2.0 sy, 0.0 ni, 95.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1879668 total, 177020 free, 607544 used, 1095104 buff/cache KiB Swap: 3145724 total, 3145428 free, 296 used. 1034648 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5404 root 20 0 197832 48024 6744 S 1.3 2.6 1:13.22 Xorg 8013 centos 20 0 555316 23104 13140 S 1.0 1.2 0:14.89 gnome-terminal- 6339 centos 20 0 332336 6016 3248 S 0.3 0.3 0:23.71 prlcc 6351 centos 20 0 21044 1532 1292 S 0.3 0.1 0:02.66 prlshprof
运行 top 命令时常用的快捷键(快捷键是在 shell 中运行 top 命令时按下的键)。
命令 | 操作 |
---|---|
b | 启用/禁用 top 菜单的粗体高亮显示 |
z | 循环切换配色方案 |
l | 循环切换负载平均值标题 |
m | 循环切换内存平均值标题 |
t | 任务信息标题 |
h | 帮助菜单 |
Shift+F | 自定义排序和显示字段 |
以下是 top 命令常用的命令行开关。
命令 | 操作 |
---|---|
-o | 按列排序(可以在前面加上 - 或 + 以进行升序或降序排序) |
-u | 仅显示指定用户的进程 |
-d | 更新 top 命令的延迟时间 |
-O | 返回 top 命令可以应用排序的列列表 |
top 命令中的排序选项屏幕,使用 Shift+F 显示。此屏幕允许自定义 top 的显示和排序选项。
Fields Management for window 1:Def, whose current sort field is %MEM Navigate with Up/Dn, Right selects for move then <Enter> or Left commits, 'd' or <Space> toggles display, 's' sets sort. Use 'q' or <Esc> to end! * PID = Process Id TGID = Thread Group Id * USER = Effective User Name ENVIRON = Environment vars * PR = Priority vMj = Major Faults delta * NI = Nice Value vMn = Minor Faults delta * VIRT = Virtual Image (KiB) USED = Res+Swap Size (KiB) * RES = Resident Size (KiB) nsIPC = IPC namespace Inode * SHR = Shared Memory (KiB) nsMNT = MNT namespace Inode * S = Process Status nsNET = NET namespace Inode * %CPU = CPU Usage nsPID = PID namespace Inode * %MEM = Memory Usage (RES) nsUSER = USER namespace Inode * TIME+ = CPU Time, hundredths nsUTS = UTS namespace Inode * COMMAND = Command Name/Line PPID = Parent Process pid UID = Effective User Id
top 命令,显示用户 rdc 的进程,并按内存使用情况排序:
PID USER %MEM PR NI VIRT RES SHR S %CPU TIME+ COMMAND 6130 rdc 6.2 20 0 1349592 117160 33232 S 0.0 1:09.34 gnome-shell 6449 rdc 3.4 20 0 1375872 64428 21400 S 0.0 0:00.43 evolution-calen 6296 rdc 1.7 20 0 1081944 32140 22596 S 0.0 0:00.40 evolution-alarm 6350 rdc 1.6 20 0 560728 29844 4256 S 0.0 0:10.16 prlsga 6281 rdc 1.5 20 0 1027176 28808 17680 S 0.0 0:00.78 nautilus 6158 rdc 1.5 20 0 1026956 28004 19072 S 0.0 0:00.20 gnome-shell-cal
显示有效的 top 字段(简略版):
[centos@CentOS ~]$ top -O PID PPID UID USER RUID RUSER SUID SUSER GID GROUP PGRP TTY TPGID
kill 命令
kill 命令用于通过其 PID 从命令 shell 中终止进程。终止进程时,我们需要指定要发送的信号。信号让内核知道我们希望如何结束进程。最常用的信号是:
SIGTERM 信号暗示内核让进程知道它应该尽快安全停止。SIGTERM 信号使进程有机会优雅地退出并执行安全的退出操作。
SIGHUP 信号大多数守护进程在收到 SIGHUP 信号后会重新启动。这通常用于在对配置文件进行更改后对进程进行操作。
SIGKILL 信号由于 SIGTERM 信号相当于请求进程关闭。内核需要一个选项来结束不响应请求的进程。当进程挂起时,使用 SIGKILL 选项明确地关闭进程。
要查看可以使用 kill 命令发送的所有信号列表,可以使用 -l 选项:
[root@CentOS]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX [root@CentOS rdc]#
使用 SIGHUP 信号重启系统:
[root@CentOS]# pgrep systemd 1 464 500 643 15071 [root@CentOS]# kill -HUP 1 [root@CentOS]# pgrep systemd 1 464 500 643 15196 15197 15198 [root@CentOS]#
pkill 命令允许管理员按进程名称发送 kill 信号。
[root@CentOS]# pgrep ping 19450 [root@CentOS]# pkill -9 ping [root@CentOS]# pgrep ping [root@CentOS]#
killall 命令将终止所有进程。小心使用 root 权限运行 killall 命令,因为它会终止所有用户的全部进程。
[root@CentOS]# killall chrome
free 命令
free 命令是一个非常简单的命令,通常用于快速检查系统的内存。它显示已使用的物理内存和交换内存的总量。
[root@CentOS]# free total used free shared buff/cache available Mem: 1879668 526284 699796 10304 653588 1141412 Swap: 3145724 0 3145724 [root@CentOS]#
nice 命令
nice 命令允许管理员根据 CPU 使用情况设置进程的调度优先级。nice 值基本上是指内核如何为进程或作业调度 CPU 时间片。默认情况下,假设进程获得对 CPU 资源的平等访问。
首先,让我们使用 top 命令检查当前正在运行的进程的 nice 值。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28 root 39 19 0 0 0 S 0.0 0.0 0:00.17 khugepaged 690 root 39 19 16808 1396 1164 S 0.0 0.1 0:00.01 alsactl] 9598 rdc 39 19 980596 21904 10284 S 0.0 1.2 0:00.27 tracker-extract 9599 rdc 39 19 469876 9608 6980 S 0.0 0.5 0:00.04 tracker-miner-a 9609 rdc 39 19 636528 13172 8044 S 0.0 0.7 0:00.12 tracker-miner-f 9611 rdc 39 19 469620 8984 6496 S 0.0 0.5 0:00.02 tracker-miner-u 27 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd 637 rtkit 21 1 164648 1276 1068 S 0.0 0.1 0:00.11 rtkit-daemon 1 root 20 0 128096 6712 3964 S 0.3 0.4 0:03.57 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.50 ksoftirqd/0 7 root 20 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 0:02.07 rcu_sched
我们要关注 NICE 列(由 NI 表示)。nice 值范围可以从 -20 到 19。-20 表示最高的优先级。
nohup nice --20 ping www.google.com &
renice
renice 命令允许我们更改当前正在运行的进程的优先级。
renice 17 -p 30727
上述命令将降低我们的 ping 进程命令的优先级。
Linux 管理员 - 防火墙设置
firewalld 是 CentOS 上 iptables 的默认前端控制器。firewalld 前端相比于原始的 iptables 有两个主要优点:
使用易于配置和实现的区域来抽象链和规则。
规则集是动态的,这意味着当设置更改和/或修改时,有状态连接不会中断。
请记住,firewalld 是 iptables 的包装器,而不是替代品。虽然可以使用 firewalld 使用自定义 iptables 命令,但建议使用 firewalld 以避免破坏防火墙功能。
首先,让我们确保 firewalld 已启动并启用。
[root@CentOS rdc]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2017-01-26 21:42:05 MST; 3h 46min ago Docs: man:firewalld(1) Main PID: 712 (firewalld) Memory: 34.7M CGroup: /system.slice/firewalld.service └─712 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
我们可以看到,firewalld 既处于活动状态(在启动时启动),又当前正在运行。如果处于非活动状态或未启动,我们可以使用:
systemctl start firewalld && systemctl enable firewalld
现在我们已经配置了 firewalld 服务,让我们确保它正在运行。
[root@CentOS]# firewall-cmd --state running [root@CentOS]#
我们可以看到,firewalld 服务完全正常运行。
Firewalld 基于区域的概念。区域通过网络管理器应用于网络接口。我们将在配置网络中讨论这一点。但就目前而言,默认情况下,更改默认区域将更改保留在“默认区域”默认状态的任何网络适配器。
让我们快速浏览一下 firewalld 自带的每个区域。
序号 | 区域和描述 |
---|---|
1 | drop 低信任级别。所有传入连接和数据包都将被丢弃,只有通过有状态性才能进行传出连接。 |
2 | block 传入连接将回复一条 icmp 消息,让发起者知道请求被禁止。 |
3 | public 所有网络都被限制。但是,可以选择明确允许选定的传入连接。 |
4 | external 配置 firewalld 进行 NAT。内部网络保持私有,但可以访问。 |
5 | dmz 只允许某些传入连接。用于 DMZ 隔离中的系统。 |
6 | work 默认情况下,更信任网络上的计算机,假设系统位于安全的办公环境中。 |
7 | hone 默认情况下,更多服务未过滤。假设系统位于家庭网络上,其中将使用 NFS、SAMBA 和 SSDP 等服务。 |
8 | trusted 网络上的所有机器都受信任。大多数传入连接都被无限制地允许。这并不适用于暴露于互联网的接口 |
最常用的区域是:public、drop、work 和 home。
以下是一些使用每个常用区域的场景:
public - 这是管理员最常用的区域。它允许您应用自定义设置并遵守 LAN 上操作的 RFC 规范。
drop - 使用 drop 的一个很好的例子是在安全会议、公共 WiFi 或直接连接到互联网的接口上。drop 假设所有未经请求的请求都是恶意的,包括 ICMP 探测。因此,任何超出状态的请求都不会收到回复。drop 的缺点是它可能会在某些情况下破坏应用程序的功能,这些应用程序需要严格遵守 RFC 规范。
work - 您位于半安全的公司 LAN 上。可以假设所有流量都相对安全。这意味着它不是 WiFi,我们可能已经部署了 IDS、IPS 和物理安全或 802.1x。我们也应该熟悉使用 LAN 的人员。
home - 您位于家庭 LAN 上。您对 LAN 上的每个系统和用户都负有个人责任。您了解 LAN 上的每一台机器,并且没有一台机器受到入侵。通常,会启动新的服务以便在受信任的个人之间共享媒体,而您无需为了安全而花费额外的时间。
区域和网络接口的工作方式是一对多的关系。一个网络接口一次只能应用一个区域。而一个区域可以同时应用于多个接口。
让我们看看有哪些可用的区域以及当前应用的区域。
[root@CentOS]# firewall-cmd --get-zones work drop internal external trusted home dmz public block
[root@CentOS]# firewall-cmd --get-default-zone public [root@CentOS]#
准备好向 firewalld 添加一些自定义规则了吗?
首先,让我们看看从外部端口扫描器看来我们的盒子是什么样的。
bash-3.2# nmap -sS -p 1-1024 -T 5 10.211.55.1 Starting Nmap 7.30 ( https://nmap.org ) at 2017-01-27 23:36 MST Nmap scan report for centos.shared (10.211.55.1) Host is up (0.00046s latency). Not shown: 1023 filtered ports PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 3.71 seconds bash-3.2#
让我们允许传入的 80 端口请求。
首先,检查应用的默认区域。
[root@CentOs]# firewall-cmd --get-default-zone public [root@CentOS]#
然后,设置允许 80 端口的规则到当前默认区域。
[root@CentOS]# firewall-cmd --zone=public --add-port = 80/tcp success [root@CentOS]#
现在,让我们在允许 80 端口连接后检查我们的盒子。
bash-3.2# nmap -sS -p 1-1024 -T 5 10.211.55.1 Starting Nmap 7.30 ( https://nmap.org ) at 2017-01-27 23:42 MST Nmap scan report for centos.shared (10.211.55.1) Host is up (0.00053s latency). Not shown: 1022 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp closed http Nmap done: 1 IP address (1 host up) scanned in 3.67 seconds bash-3.2#
它现在允许对 80 端口的未经请求的流量。
让我们将默认区域设置为 drop 并看看端口扫描会发生什么。
[root@CentOS]# firewall-cmd --set-default-zone=drop success [root@CentOS]# firewall-cmd --get-default-zone drop [root@CentOs]#
现在让我们扫描网络接口处于更安全区域的主机。
bash-3.2# nmap -sS -p 1-1024 -T 5 10.211.55.1 Starting Nmap 7.30 ( https://nmap.org ) at 2017-01-27 23:50 MST Nmap scan report for centos.shared (10.211.55.1) Host is up (0.00094s latency). All 1024 scanned ports on centos.shared (10.211.55.1) are filtered Nmap done: 1 IP address (1 host up) scanned in 12.61 seconds bash-3.2#
现在,所有内容都从外部过滤。
如下所示,当处于 drop 区域时,主机甚至不会响应 ICMP ping 请求。
bash-3.2# ping 10.211.55.1 PING 10.211.55.1 (10.211.55.1): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2
让我们再次将默认区域设置为 public。
[root@CentOs]# firewall-cmd --set-default-zone=public success [root@CentOS]# firewall-cmd --get-default-zone public [root@CentOS]#
现在让我们检查 public 区域中当前的过滤规则集。
[root@CentOS]# firewall-cmd --zone=public --list-all public (active) target: default icmp-block-inversion: no interfaces: enp0s5 sources: services: dhcpv6-client ssh ports: 80/tcp protocols: masquerade: no forward-ports: sourceports: icmp-blocks: rich rules: [root@CentOS rdc]#
根据配置,我们的 80 端口过滤规则仅存在于正在运行的配置中。这意味着一旦系统重新启动或 firewalld 服务重新启动,我们的规则将被丢弃。
我们很快就会配置 httpd 守护进程,所以让我们使我们的更改持久化:
[root@CentOS]# firewall-cmd --zone=public --add-port=80/tcp --permanent success [root@CentOS]# systemctl restart firewalld [root@CentOS]#
现在,public 区域中的 80 端口规则在重新启动和服务重启后仍然有效。
以下是使用 firewall-cmd 应用的常用 firewalld 命令。
命令 | 操作 |
---|---|
firewall-cmd --get-zones | 列出可以应用于接口的所有区域 |
firewall-cmd --status | 返回 firewalld 服务的当前状态 |
firewall-cmd --get-default-zone | 获取当前默认区域 |
firewall-cmd --set-default-zone=<zone> | 将默认区域设置为当前上下文 |
firewall-cmd --get-active-zone | 获取当前应用于接口的上下文区域 |
firewall-cmd --zone=<zone> --list-all | 列出指定区域的配置 |
firewall-cmd --zone=<zone> --addport=<port/transport protocol> | 将端口规则应用于区域过滤器 |
--permanent | 使区域更改持久化。此标志与修改命令一起使用。 |
这些是管理和配置firewalld 的基本概念。
在更复杂的网络场景中,配置 CentOS 中基于主机的防火墙服务可能是一项复杂的任务。CentOS 中firewalld 和 iptables 的高级用法和配置需要一个完整的教程。但是,我们已经介绍了足以完成大部分日常任务的基础知识。
在CentOS Linux中配置PHP
PHP 是当今使用最广泛的 Web 语言之一。在 CentOS 上安装LAMP 栈是每个系统管理员都需要执行的操作,很可能越早越好。
传统的 LAMP 栈由 (L)inux (A)pache (M)ySQL (P)HP 组成。
CentOS 上的LAMP 栈主要包含三个组件:
- Web 服务器
- Web 开发平台/语言
- 数据库服务器
注意 − LAMP 栈这一术语还可以包括以下技术:PostgreSQL、MariaDB、Perl、Python、Ruby、NGINX Web 服务器。
在本教程中,我们将坚持使用 CentOS GNU Linux 的传统LAMP 栈:Apache Web 服务器、MySQL 数据库服务器和 PHP。
我们实际上将使用 MariaDB。MariaDB 对 MySQL 配置文件、数据库和表具有透明性。由于 Oracle 接管了 MySQL 的开发,并且由于许可和开源合规性的限制,MariaDB 现在包含在标准 CentOS 存储库中,而不是 MySQL。
我们需要做的第一件事是安装 Apache。
[root@CentOS]# yum install httpd Loaded plugins: fastestmirror, langpacks base | 3.6 kB 00:00:00 extras | 3.4 kB 00:00:00 updates | 3.4 kB 00:00:00 extras/7/x86_64/primary_d | 121 kB 00:00:00 Loading mirror speeds from cached hostfile * base: mirror.sigmanet.com * extras: linux.mirrors.es.net * updates: mirror.eboundhost.com Resolving Dependencies --> Running transaction check ---> Package httpd.x86_64 0:2.4.6-45.el7.centos will be installed --> Processing Dependency: httpd-tools = 2.4.6-45.el7.centos for package: httpd-2.4.6-45.el7.centos.x86_64 --> Processing Dependency: /etc/mime.types for package: httpd-2.4.645.el7.centos.x86_64 --> Running transaction check ---> Package httpd-tools.x86_64 0:2.4.6-45.el7.centos will be installed ---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed --> Finished Dependency Resolution Installed: httpd.x86_64 0:2.4.6-45.el7.centos Dependency Installed: httpd-tools.x86_64 0:2.4.6-45.el7.centos mailcap.noarch 0:2.1.41-2.el7 Complete! [root@CentOS]#
让我们配置httpd 服务。
[root@CentOS]# systemctl start httpd && systemctl enable httpd
现在,让我们确保 Web 服务器可以通过 firewalld 访问。
bash-3.2# nmap -sS -p 1-1024 -T 5 -sV 10.211.55.1 Starting Nmap 7.30 ( https://nmap.org ) at 2017-01-28 02:00 MST Nmap scan report for centos.shared (10.211.55.1) Host is up (0.00054s latency). Not shown: 1022 filtered ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1 (protocol 2.0) 80/tcp open http Apache httpd 2.4.6 ((CentOS)) Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 10.82 seconds bash-3.2#
正如 nmap 服务探测所示,Apache Web 服务器正在监听并响应 CentOS 主机上的请求。
安装 MySQL 数据库服务器
[root@CentOS rdc]# yum install mariadb-server.x86_64 && yum install mariadb- devel.x86_64 && mariadb.x86_64 && mariadb-libs.x86_64
我们正在安装以下 MariaDB 存储库软件包:
mariadb-server.x86_64
主要的 MariaDB 服务器守护进程程序包。
mariadb-devel.x86_64
需要使用 MySQL/MariaDB 兼容性从源代码编译的文件。
mariadb.x86_64
用于从命令行管理 MariaDB 服务器的 MariaDB 客户端实用程序。
mariadb-libs.x86_64
MariaDB 的常用库,其他使用 MySQL/MariaDB 支持编译的应用程序可能需要这些库。
现在,让我们启动并启用 MariaDB 服务。
[root@CentOS]# systemctl start mariadb [root@CentOS]# systemctl enable mariadb
注意 − 与 Apache 不同,我们不会通过基于主机的防火墙 (firewalld) 启用对 MariaDB 的连接。使用数据库服务器时,最佳安全实践是仅允许本地套接字连接,除非特别需要远程套接字访问。
让我们确保 MariaDB 服务器正在接受连接。
[root@CentOS#] netstat -lnt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN [root@CentOS rdc]#
我们可以看到,MariaDB 正在 3306 tcp 端口监听。我们将保持基于主机的防火墙 (firewalld) 阻止对 3306 端口的传入连接。
安装和配置 PHP
[root@CentOS#] yum install php.x86_64 && php-common.x86_64 && php-mysql.x86_64 && php-mysqlnd.x86_64 && php-pdo.x86_64 && php-soap.x86_64 && php-xml.x86_64
我建议安装以下 php 包以实现常见的兼容性:
- php-common.x86_64
- php-mysql.x86_64
- php-mysqlnd.x86_64
- php-pdo.x86_64
- php-soap.x86_64
- php-xml.x86_64
[root@CentOS]# yum install -y php-common.x86_64 php-mysql.x86_64 php- mysqlnd.x86_64 php-pdo.x86_64 php-soap.x86_64 php-xml.x86_64
这是位于 Apache webroot /var/www/html/ 的简单 php 文件。
[root@CentOS]# cat /var/www/html/index.php <html> <head> <title>PHP Test Page</title> </head> <body> PHP Install <?php echo "We are now running PHP on GNU Centos Linux!<br />" ?> </body> </html> [root@CentOS]#
让我们将页面的拥有组更改为我们的 http 守护程序在其下运行的系统用户。
[root@CentOS]# chgrp httpd /var/www/html/index.php && chmod g+rx /var/www/html/index.php ---
通过 ncat 手动请求时。
bash-3.2# ncat 10.211.55.1 80 GET / index.php HTTP/1.1 200 OK Date: Sat, 28 Jan 2017 12:06:02 GMT Server: Apache/2.4.6 (CentOS) PHP/5.4.16 X-Powered-By: PHP/5.4.16 Content-Length: 137 Connection: close Content-Type: text/html; charset=UTF-8 <html> <head> <title>PHP Test Page</title> </head> <body> PHP Install We are now running PHP on GNU Centos Linux!<br /> </body> </html> bash-3.2#
PHP 和 LAMP 非常流行的 Web 编程技术。作为 CentOS 管理员,LAMP 的安装和配置肯定会出现在您的需求列表中。易于使用的 CentOS 软件包省去了从源代码编译 Apache、MySQL 和 PHP 的许多工作。
在CentOS Linux中设置Python
Python 是一种广泛使用的解释型语言,它为在 Linux(和其他操作系统)上编写脚本应用程序的世界带来了专业性。曾经 Perl 是行业标准,而 Python 在许多方面已经超越了 Perl。
与 Perl 相比,Python 的一些优势:
快速改进
作为语言标准的库
代码的可读性在语言定义中得到了体现
许多专业的框架,从 GUI 支持到 Web 开发,无所不包
Python 可以完成 Perl 可以完成的所有事情,并且在很多情况下做得更好。尽管 Perl 在 Linux 管理员的工具箱中仍然占有一席之地,但学习 Python 作为一项技能是一个不错的选择。
Python 最大的缺点有时与其优势有关。历史上,Python 最初是为教学编程而设计的。有时,它“易于阅读”和“以正确的方式做事”的核心基础会在编写简单代码时造成不必要的复杂性。此外,它的标准库在从 2.X 版本过渡到 3.X 版本时也造成了一些问题。
Python 脚本实际上用于 CentOS 的核心功能,这些功能对操作系统的功能至关重要。因此,将我们的开发 Python 环境与 CentOS 的核心 Python 环境隔离非常重要。
首先,目前有两个版本的 Python:Python 2.X 和 Python 3.X。
这两个阶段仍在积极生产中,尽管 2.X 版本很快就要被淘汰(并且已经持续了几年)。出现两个活动版本的 Python 的原因基本上是修复了 2.X 版本的缺点。这需要 3.X 版本的一些核心功能以无法支持某些 2.X 脚本的方式重做。
基本上,克服这种过渡的最佳方法是:为 3.X 开发,并跟上最新版本的 2.X 以用于旧版脚本。目前,CentOS 7.X 依赖于 2.X 的半当前版本。
在撰写本文时,Python 的最新版本为:3.4.6 和 2.7.13。
不要让这使你感到困惑或得出任何关于 Python 的结论。设置 Python 环境非常简单。借助 Python 框架和库,这项任务实际上很容易完成。
在设置 Python 环境之前,我们需要一个合理的的环境。首先,让我们确保我们的 CentOS 安装已完全更新并安装了一些构建实用程序。
步骤 1 − 更新 CentOS。
[root@CentOS]# yum -y update
步骤 2 − 安装构建实用程序。
[root@CentOS]# yum -y groupinstall "development tools"
步骤 3 − 安装一些需要的软件包。
[root@CentOS]# yum install -y zlib-dev openssl-devel sqlite-devel bip2-devel
现在我们需要从源代码安装最新的 Python 2.X 和 3.X。
- 下载压缩存档
- 解压文件
- 编译源代码
让我们首先为/usr/src/ 中的每个 Python 安装创建一个构建目录。
[root@CentOS]# mkdir -p /usr/src/pythonSource
现在让我们下载每个版本的源代码包:
[root@CentOS]# wget https://www.pythonlang.cn/ftp/python/2.7.13/Python-2.7.13.tar.xz [root@CentOS]# wget https://www.pythonlang.cn/ftp/python/3.6.0/Python-3.6.0.tar.xz
现在我们需要从存档中解压每个文件。
步骤 1 − 安装 xz-libs 并解压 tarballs。
[root@CentOS]# yum install xz-libs [root@CentOS python3]# xz -d ./*.xz [root@CentOS python3]# ls Python-2.7.13.tar Python-3.6.0.tar [root@CentOS python3]#
步骤 2 − 从其 tarball 中解压每个安装程序。
[root@CentOS]# tar -xvf ./Python-2.7.13.tar [root@CentOS]# tar -xvf ./Python-3.6.0.tar
步骤 3 − 进入每个目录并运行配置脚本。
[root@CentOS]# ./configure --prefix=/usr/local root@CentOS]# make altinstall
注意 − 确保使用altinstall 而不是 install。这将使 CentOS 和开发版本的 Python 保持分离。否则,您可能会破坏 CentOS 的功能。
您现在将看到编译过程开始。喝杯咖啡,休息 15 分钟,直到完成。由于我们安装了 Python 的所有必要依赖项,因此编译过程应该能够顺利完成,不会出错。
让我们确保我们安装了最新的 2.X 版本的 Python。
[root@CentOS Python-2.7.13]# /usr/local/bin/python2.7 -V Python 2.7.13 [root@CentOS Python-2.7.13]#
注意 − 您需要为指向我们开发环境的 Python 2.X 的 Shebang 行添加前缀。
[root@CentOS Python-2.7.13]# cat ver.py #!/usr/local/bin/python2.7 import sys print(sys.version)
[root@CentOS Python-2.7.13]# ./ver.py 2.7.13 (default, Jan 29 2017, 02:24:08) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
就这样,我们为 2.X 和 3.X 版本分别安装了 Python。从这里,我们可以使用每个版本以及pip 和 virtualenv 等实用程序来进一步简化管理 Python 环境和软件包安装的负担。
在CentOS Linux中配置Ruby
Ruby 是一种非常适合 Web 开发和 Linux 管理的语言。Ruby 提供了前面讨论的所有语言(PHP、Python 和 Perl)中发现的许多好处。
要安装 Ruby,最好通过rbenv 引导,这允许管理员轻松安装和管理 Ruby 环境。
安装 Ruby 的另一种方法是使用 Ruby 的标准 CentOS 软件包。建议使用rbenv 方法及其所有优点。对于不熟悉 Ruby 的用户,CentOS 软件包会更容易。
首先,让我们获取 rbenv 安装程序所需的一些依赖项。
- git-core
- zlib
- zlib-devel
- gcc-c++
- patch
- readline
- readline-devel
- libyaml-devel
- libffi-devel
- openssl-devel
- make
- bzzip2
- autoconf
- automake
- libtool
- bison
- curl
- sqlite-devel
根据安装 CentOS 时选择的选项和角色,这些软件包中的大部分可能已经安装。最好安装所有我们不确定的软件包,因为这可以减少安装需要依赖项的软件包时的麻烦。
[root@CentOS]# yum -y install git-core zlib zlib-devel gcc-c++ patch readline readline-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison curl sqlite-devel
方法 1:用于动态 Ruby 开发环境的 rbenv
现在作为将使用Ruby 的用户:
[rdc@CentOS ~]$ git clone https://github.com/rbenv/rbenv.git [rdc@CentOS ~]$ https://github.com/rbenv/ruby-build.git
ruby-build 将为rbenv 提供安装功能:
注意 − 在运行install.sh 之前,我们需要切换到 root 或管理员用户。
[rdc@CentOS ruby-build]$ cd ~/ruby-build [rdc@CentOS ruby-build]# ./install.sh
让我们设置 rbenv 的 shell 并确保我们安装了正确的选项。
[rdc@CentOS ~]$ source ~/rbenv/rbenv.d/exec/gem-rehash.bash [rdc@CentOS ruby-build]$ ~/rbenv/bin/rbenv rbenv 1.1.0-2-g4f8925a Usage: rbenv <command> [<args>]
一些有用的 rbenv 命令:
命令 | 操作 |
---|---|
local | 设置或显示特定于应用程序的本地 Ruby 版本 |
global | 设置或显示全局 Ruby 版本 |
shell | 设置或显示特定于 shell 的 Ruby 版本 |
install | 使用 ruby-build 安装 Ruby 版本 |
uninstall | 卸载特定 Ruby 版本 |
rehash | 重新散列 rbenv shims(安装可执行文件后运行此命令) |
version | 显示当前 Ruby 版本及其来源 |
versions | 列出 rbenv 可用的所有 Ruby 版本 |
which | 显示可执行文件的完整路径 |
whence | 列出包含给定可执行文件的所有 Ruby 版本 |
现在让我们安装 Ruby:
[rdc@CentOS bin]$ ~/rbenv/bin/rbenv install -v 2.2.1
编译完成后:
[rdc@CentOS ~]$ ./ruby -v ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux] [rdc@CentOS ~]$
我们现在拥有一个功能正常的 Ruby 环境,其中包含更新且可用的 Ruby 2.X 分支版本。
方法 2:从 CentOS 软件包安装 Ruby
这是最简单的方法。但是,它可能会受到 CentOS 打包的版本和 gem 的限制。对于重要的开发工作,强烈建议使用rbenv 方法来安装 Ruby。
安装 Ruby、所需的开发软件包和一些常用 gem。
[root@CentOS rdc]# yum install -y ruby.x86_64 ruby-devel.x86_64 ruby- libs.x86_64 ruby-gem-json.x86_64 rubygem-rake.noarch
不幸的是,我们剩下的只是稍微过时的 Ruby 版本。
[root@CentOS rdc]# ruby -v ruby 2.0.0p648 (2015-12-16) [x86_64-linux] [root@CentOS rdc]#
Linux 管理员 - 为 CentOS Linux 设置 Perl
Perl 已经存在很长时间了。它最初被设计为用于解析文本文件的报告语言。随着流行度的提高,Perl 添加了模块支持或 CPAN、套接字、线程和其他在强大的脚本语言中需要的功能。
与 PHP、Python 或 Ruby 相比,Perl 最大的优势在于:它可以轻松完成任务。Perl 的这种理念并不总是意味着它以正确的方式完成任务。但是,对于 Linux 上的管理任务,Perl 被认为是脚本语言的首选。
与 Python 或 Ruby 相比,Perl 的一些优势:
强大的文本处理能力
Perl 能够快速编写脚本(通常,Perl 脚本的代码行数比等效的 Python 或 Ruby 脚本少几十行)
Perl 几乎无所不能
Perl 的一些缺点包括:
语法可能令人困惑
Perl 的编码风格可能独特,从而影响协作
Perl 并不是真正的面向对象语言
通常情况下,在使用 Perl 时,并没有过多考虑标准化和最佳实践。
在决定使用 Perl、Python 或 PHP 时,应该问以下问题:
- 这个应用程序将来需要版本控制吗?
- 其他人将来需要修改代码吗?
- 其他人需要使用这个应用程序吗?
- 这个应用程序将来会在其他机器或 CPU 架构上使用吗?
如果以上所有问题的答案都是“否”,那么 Perl 是一个不错的选择,并且可以加快最终结果的实现速度。
说完了这些,让我们配置 CentOS 服务器以使用最新版本的 Perl。
在安装 Perl 之前,我们需要了解对 Perl 的支持。正式来说,Perl 只支持最近两个稳定版本。因此,我们希望确保我们的开发环境与 CentOS 版本隔离。
隔离的原因是:如果有人向 CentOS 社区发布了一个 Perl 工具,则很可能对其进行修改以使其能够在 CentOS 附带的 Perl 版本上运行。但是,我们也希望安装最新版本以用于开发目的。与 Python 一样,CentOS 提供的 Perl 重点在于可靠性,而不是前沿技术。
让我们检查一下 CentOS 7 上当前的 Perl 版本。
[root@CentOS]# perl -v This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
我们目前运行的是 Perl 5.16.3。截至撰写本文时,最新版本是:perl-5.24.0
我们肯定希望升级我们的版本,以便能够在我们的代码中使用最新的 Perl 模块。幸运的是,有一个很好的工具可以维护 Perl 环境并保持 CentOS 版本的 Perl 与之隔离。它被称为perlbrew。
让我们安装 Perl Brew。
[root@CentOS]# curl -L https://install.perlbrew.pl | bash % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 170 100 170 0 0 396 0 --:--:-- --:--:-- --:--:-- 397 100 1247 100 1247 0 0 1929 0 --:--:-- --:--:-- --:--:-- 1929
现在我们已经安装了 Perl Brew,让我们为最新版本的 Perl 创建一个环境。
首先,我们需要当前安装的 Perl 版本来引导 perlbrew 安装。因此,让我们从 CentOS 存储库获取一些必要的 Perl 模块。
注意 - 当可用时,我们总是希望使用 CentOS Perl 模块而不是使用 CPAN 来安装 CentOS Perl。
步骤 1 - 安装 CentOS Perl Make::Maker 模块。
[root@CentOS]# yum -y install perl-ExtUtils-MakeMaker.noarch
步骤 2 - 安装最新版本的 perl。
[root@CentOS build]# source ~/perl5/perlbrew/etc/bashrc [root@CentOS build]# perlbrew install -n -j4 --threads perl-5.24.1
我们为 Perl 安装选择的选项包括:
n - 不进行测试
j4 - 为安装例程并行执行 4 个线程(我们使用的是四核 CPU)
threads - 为 Perl 启用线程支持
安装成功后,让我们切换到最新的 Perl 环境。
[root@CentOS]# ~/perl5/perlbrew/bin/perlbrew use perl-5.24.1 A sub-shell is launched with perl-5.24.1 as the activated perl. Run 'exit' to finish it. [root@CentOS]# perl -v This is perl 5, version 24, subversion 1 (v5.24.1) built for x86_64-linuxthread-multi (with 1 registered patch, see perl -V for more detail) Copyright 1987-2017, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at https://www.perl5.cn/, the Perl Home Page. [root@CentOS]#
简单的 Perl 脚本,打印在我们的 perlbrew 环境中运行的 perl 版本:
[root@CentOS]# cat ./ver.pl #!/usr/bin/perl print $^V . "\n";
[root@CentOS]# perl ./ver.pl v5.24.1 [root@CentOS]#
安装 perl 后,我们可以使用 perl brew 的 cpanm 加载 cpan 模块:
[root@CentOS]# perl-brew install-cpanm
现在让我们使用 cpanm 安装程序使用 perl brew 中当前的 5.24.1 Perl 版本来安装 LWP 模块。
步骤 1 - 切换到当前 Perl 版本的上下文。
[root@CentOS ~]# ~/perl5/perlbrew/bin/perlbrew use perl-5.24.1
启动一个子 shell,其中 perl-5.24.1 作为激活的 perl。运行 'exit' 以结束它。
[root@CentOS ~]#
步骤 2 - 安装 LWP 用户代理 Perl 模块。
[root@CentOS ~]# ~/perl5/perlbrew/bin/cpanm -i LWP::UserAgent
步骤 3 - 现在让我们使用新的 CPAN 模块测试我们的 Perl 环境。
[root@CentOS ~]# cat ./get_header.pl #!/usr/bin/perl use LWP; my $browser = LWP::UserAgent->new(); my $response = $browser->get("http://www.slcc.edu/"); unless(!$response->is_success) { print $response->header("Server"); } [root@CentOS ~]# perl ./get_header.pl Microsoft-IIS/8.5 [root@CentOS ~]#
就是这样!Perl Brew 使隔离 perl 环境变得轻而易举,并且可以被认为是 Perl 最佳实践。
安装和配置Open LDAP
LDAP,即轻量级目录访问协议,是一种用于访问企业中已知的目录内的 X.500 服务容器的协议。熟悉 Windows 服务器管理的人可以认为 LDAP 的性质与 Active Directory 非常相似。它甚至是一个将 Windows 工作站与 OpenLDAP CentOS 企业互联的广泛使用的概念。另一方面,CentOS Linux 工作站可以共享资源并参与 Windows 域中的基本功能。
在 CentOS 上部署 LDAP 作为目录服务器代理、目录系统代理或 DSA(这些首字母缩写词都是同一个意思)类似于使用具有 NDS 的目录树结构的旧版 Novell Netware 安装。
LDAP 的简史
LDAP 的创建是为了高效地访问具有企业资源的 X.500 目录。X.500 和 LDAP 具有相同的特性,并且非常相似,以至于 LDAP 客户端可以使用一些辅助程序来访问 X.500 目录。虽然 LDAP 也有自己的目录服务器,称为slapd。LDAP 和 DAP 之间的区别在于,轻量级版本设计为通过 TCP 运行。
而DAP 使用完整的 OSI 模型。随着互联网、TCP/IP 和以太网在当今网络中的兴起,在特定遗留计算模型之外,使用 DAP 和本地 X.500 企业目录的目录服务实施很少见。
CentOS Linux 的 openldap 主要组件包括:
openldap | LDAP 支持库 |
---|---|
openldap-server | LDAP 服务器 |
openldap-clients | LDAP 客户端实用程序 |
openldap-devel | OpenLDAP 的开发库 |
compay-openldap | OpenLDAP 共享库 |
slapd | OpenLDAP 的目录服务器守护程序 |
slurpd | 用于在企业域中进行 LDAP 复制 |
注意 - 命名企业时,最佳实践是使用.local TLD。使用.net 或.com 可能会在隔离在线和内部域基础架构时造成困难。想象一下,一家公司在内部同时使用acme.com 进行内部和外部操作所需要做的额外工作。因此,明智的做法是将互联网资源称为acme.com 或acme.net。然后,本地网络企业资源显示为acme.local。这需要配置 DNS 记录,但会带来简单性、流畅性和安全性。
在 CentOS 上安装 Open LDAP
从YUM 安装 openldap、openldap-servers、openldap-clients 和 migrationstools。
[root@localhost]# yum -y install openldap openldap-servers openldap-clients migration tools Loaded plugins: fastestmirror, langpacks updates | 3.4 kB 00:00:00 updates/7/x86_64/primary_db | 2.2 MB 00:00:05 Determining fastest mirrors (1/2): extras/7/x86_64/primary_db | 121 kB 00:00:01 (2/2): base/7/x86_64/primary_db | 5.6 MB 00:00:16 Package openldap-2.4.40-13.el7.x86_64 already installed and latest version Resolving Dependencies --> Running transaction check ---> Package openldap-clients.x86_64 0:2.4.40-13.el7 will be installed ---> Package openldap-servers.x86_64 0:2.4.40-13.el7 will be installed --> Finished Dependency Resolution base/7/x86_64/group_gz | 155 kB 00:00:00 Dependencies Resolved =============================================================================== =============================================================================== Package Arch Version Repository Size =============================================================================== =============================================================================== Installing: openldap-clients x86_64 2.4.40-13.el7 base 188 k openldap-servers x86_64 2.4.40-13.el7 base 2.1 M Transaction Summary =============================================================================== =============================================================================== Install 2 Packages Total download size: 2.3 M Installed size: 5.3 M Downloading packages: Installed: openldap-clients.x86_64 0:2.4.40-13.el7 openldap-servers.x86_64 0:2.4.40-13.el7 Complete! [root@localhost]#
现在,让我们启动并启用slapd 服务:
[root@centos]# systemctl start slapd [root@centos]# systemctl enable slapd
此时,让我们确保我们的openldap 结构位于/etc/openldap 中。
root@localhost]# ls /etc/openldap/ certs check_password.conf ldap.conf schema slapd.d [root@localhost]#
然后确保我们的 slapd 服务正在运行。
root@centos]# netstat -antup | grep slapd tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 1641/slapd tcp6 0 0 :::389 :::* LISTEN 1641/slapd [root@centos]#
接下来,让我们配置Open LDAP 安装。
确保已创建我们的系统ldap 用户。
[root@localhost]# id ldap uid=55(ldap) gid=55(ldap) groups=55(ldap) [root@localhost]#
生成我们的 LDAP 凭据。
[root@localhost]# slappasswd New password: Re-enter new password: {SSHA}20RSyjVv6S6r43DFPeJgASDLlLoSU8g.a10 [root@localhost]#
我们需要保存 slappasswd 的输出。
配置 Open LDAP
步骤 1 - 为域配置 LDAP 并添加管理员用户。
首先,我们希望设置我们的 openLDAP 环境。以下是与ldapmodify 命令一起使用的模板。
dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=vmnet,dc=local dn: olcDatabase = {2}hdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=ldapadm,dc=vmnet,dc=local dn: olcDatabase = {2}hdb,cn=config changetype: modify replace: olcRootPW olcRootPW: <output from slap
使用 ldapmodify 命令更改:/etc/openldap/slapd.d/cn=config/olcDatabase = {1}monitor.ldif。
[root@localhost]# ldapmodify -Y EXTERNAL -H ldapi:/// -f /home/rdc/Documents/db.ldif SASL/EXTERNAL authentication started SASL username: gidNumber = 0+uidNumber = 0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase = {2}hdb,cn=config" modifying entry "olcDatabase = {2}hdb,cn=config" modifying entry "olcDatabase = {2}hdb,cn=config" [root@localhost cn=config]#
让我们检查修改后的 LDAP 配置。
root@linux1 ~]# vi /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif [root@centos]# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. # CRC32 a163f14c dn: olcDatabase = {2}hdb objectClass: olcDatabaseConfig objectClass: olcHdbConfig olcDatabase: {2}hdb olcDbDirectory: /var/lib/ldap olcDbIndex: objectClass eq,pres olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub structuralObjectClass: olcHdbConfig entryUUID: 1bd9aa2a-8516-1036-934b-f7eac1189139 creatorsName: cn=config createTimestamp: 20170212022422Z olcSuffix: dc=vmnet,dc=local olcRootDN: cn=ldapadm,dc=vmnet,dc=local olcRootPW:: e1NTSEF1bUVyb1VzZTRjc2dkYVdGaDY0T0k = entryCSN: 20170215204423.726622Z#000000#000#000000 modifiersName: gidNumber = 0+uidNumber = 0,cn=peercred,cn=external,cn=auth modifyTimestamp: 20170215204423Z [root@centos]#
正如您所看到的,我们的 LDAP 企业修改成功了。
接下来,我们希望为 OpenLDAP 创建一个自签名 ssl 证书。这将保护企业服务器和客户端之间的通信安全。
步骤 2 - 为 OpenLDAP 创建自签名证书。
我们将使用openssl 创建自签名 ssl 证书。请转到下一章使用 openssl 创建 LDAP SSL 证书,了解有关保护与 OpenLDAP 通信安全的说明。然后,在配置 ssl 证书后,我们将完成 OpenLDAP 企业配置。
步骤 3 - 配置 OpenLDAP 以使用证书进行安全通信。
使用vim 创建一个包含以下信息的certs.ldif 文件:
dn: cn=config changetype: modify replace: olcTLSCertificateFile olcTLSCertificateFile: /etc/openldap/certs/yourGeneratedCertFile.pem dn: cn=config changetype: modify replace: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/openldap/certs/youGeneratedKeyFile.pem
接下来,再次使用ldapmodify 命令将更改合并到 OpenLDAP 配置中。
[root@centos rdc]# ldapmodify -Y EXTERNAL -H ldapi:/// -f certs.ldif SASL/EXTERNAL authentication started SASL username: gidNumber = 0+uidNumber = 0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config" [root@centos]#
最后,让我们测试我们的 OpenLADP 配置。
[root@centos]# slaptest -u config file testing succeeded [root@centos]#
步骤 4 - 设置 slapd 数据库。
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG && chown ldap:ldap /var/lib/ldap/*
更新 OpenLDAP 模式。
添加 cosine 和 nis LDAP 模式。
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
最后,创建企业模式并将其添加到当前的 OpenLDAP 配置中。
以下是适用于名为 vmnet.local 的域以及名为ldapadm 的 LDAP 管理员的配置。
dn: dc=vmnet,dc=local dc: vmnet objectClass: top objectClass: domain dn: cn=ldapadm ,dc=vmnet,dc=local objectClass: organizationalRole cn: ldapadm description: LDAP Manager dn: ou = People,dc=vmnet,dc=local objectClass: organizationalUnit ou: People dn: ou = Group,dc=vmnet,dc=local objectClass: organizationalUnit ou: Group
最后,将其导入到当前的 OpenLDAP 模式中。
[root@centos]# ldapadd -x -W -D "cn=ldapadm,dc=vmnet,dc=local" -f ./base.ldif Enter LDAP Password: adding new entry "dc=vmnet,dc=local" adding new entry "cn=ldapadm ,dc=vmnet,dc=local" adding new entry "ou=People,dc=vmnet,dc=local" adding new entry "ou=Group,dc=vmnet,dc=local" [root@centos]#
步骤 5 - 设置 OpenLDAP 企业用户。
打开vim 或您喜欢的文本编辑器并复制以下格式。此设置适用于“vmnet.local”LDAP 域上的名为“entacct”的用户。
dn: uid=entacct,ou=People,dc=vmnet,dc=local objectClass: top objectClass: account objectClass: posixAccount objectClass: shadowAccount cn: entacct uid: entacct uidNumber: 9999 gidNumber: 100 homeDirectory: /home/enyacct loginShell: /bin/bash gecos: Enterprise User Account 001 userPassword: {crypt}x shadowLastChange: 17058 shadowMin: 0 shadowMax: 99999 shadowWarning: 7
现在,将上面保存的文件导入到 OpenLdap 模式中。
[root@centos]# ldapadd -x -W -D "cn=ldapadm,dc=vmnet,dc=local" -f entuser.ldif Enter LDAP Password: adding new entry "uid=entacct,ou=People,dc=vmnet,dc=local" [root@centos]#
在用户可以访问 LDAP 企业之前,我们需要按如下方式分配密码:
ldappasswd -s password123 -W -D "cn=ldapadm,dc=entacct,dc=local" -x "uid=entacct ,ou=People,dc=vmnet,dc=local"
-s 指定用户的密码
-x 是应用密码更新的用户名
-D 是用于针对 LDAP 模式进行身份验证的“区分名称”。
最后,在登录企业帐户之前,让我们检查我们的OpenLDAP 条目。
[root@centos rdc]# ldapsearch -x cn=entacct -b dc=vmnet,dc=local # extended LDIF # # LDAPv3 # base <dc=vmnet,dc=local> with scope subtree # filter: cn=entacct # requesting: ALL # # entacct, People, vmnet.local dn: uid=entacct,ou=People,dc=vmnet,dc=local objectClass: top objectClass: account objectClass: posixAccount objectClass: shadowAccount cn: entacct uid: entacct uidNumber: 9999 gidNumber: 100 homeDirectory: /home/enyacct loginShell: /bin/bash gecos: Enterprise User Account 001 userPassword:: e2NyeXB0fXg= shadowLastChange: 17058 shadowMin: 0 shadowMax: 99999 shadowWarning: 7
将/etc/passwd 和/etc/groups 等内容转换为 OpenLDAP 身份验证需要使用迁移工具。这些工具包含在migrationtools 软件包中。然后安装到/usr/share/migrationtools。
[root@centos openldap-servers]# ls -l /usr/share/migrationtools/ total 128 -rwxr-xr-x. 1 root root 2652 Jun 9 2014 migrate_aliases.pl -rwxr-xr-x. 1 root root 2950 Jun 9 2014 migrate_all_netinfo_offline.sh -rwxr-xr-x. 1 root root 2946 Jun 9 2014 migrate_all_netinfo_online.sh -rwxr-xr-x. 1 root root 3011 Jun 9 2014 migrate_all_nis_offline.sh -rwxr-xr-x. 1 root root 3006 Jun 9 2014 migrate_all_nis_online.sh -rwxr-xr-x. 1 root root 3164 Jun 9 2014 migrate_all_nisplus_offline.sh -rwxr-xr-x. 1 root root 3146 Jun 9 2014 migrate_all_nisplus_online.sh -rwxr-xr-x. 1 root root 5267 Jun 9 2014 migrate_all_offline.sh -rwxr-xr-x. 1 root root 7468 Jun 9 2014 migrate_all_online.sh -rwxr-xr-x. 1 root root 3278 Jun 9 2014 migrate_automount.pl -rwxr-xr-x. 1 root root 2608 Jun 9 2014 migrate_base.pl
步骤 6 - 最后,我们需要允许访问 slapd 服务,以便它可以提供服务请求。
firewall-cmd --permanent --add-service=ldap firewall-cmd --reload
配置 LDAP 客户端访问
配置 LDAP 客户端访问需要客户端上安装以下软件包:openldap、open-ldap clients 和 nss_ldap。
为客户端系统配置 LDAP 身份验证相对容易。
步骤 1 - 安装依赖软件包:
# yum install -y openldap-clients nss-pam-ldapd
步骤 2 - 使用authconfig 配置 LDAP 身份验证。
authconfig --enableldap --enableldapauth --ldapserver=10.25.0.1 -- ldapbasedn="dc=vmnet,dc=local" --enablemkhomedir --update
步骤 3 - 重启 nslcd 服务。
systemctl restart nslcd
Linux管理员 - 创建SSL证书
TLS 和 SSL 背景
TLS 是继 SSL 之后套接字层安全的新标准。TLS 提供了更好的加密标准以及其他安全和协议包装器功能,从而提升了 SSL。通常,TLS 和 SSL 术语可以互换使用。但是,作为专业的 CentOS 管理员,务必注意两者之间的区别和历史。
SSL 最高版本为 3.0。SSL 是在 Netscape 的推动下成为行业标准的。在 Netscape 被 AOL(90 年代流行的 ISP,又名 America Online)收购后,AOL 从未真正推动 SSL 所需的安全改进。
在 3.1 版中,SSL 技术转向开放系统标准,并更名为TLS。由于SSL 的版权仍归 AOL 所有,因此创造了一个新术语 - TLS - 传输层安全。因此,重要的是要承认TLS 实际上与SSL 不同。特别是,由于较旧的SSL 技术存在已知安全问题,因此现在有些技术已被认为已过时。
注意 - 本教程在谈到 3.1 及更高版本的技术时将使用术语TLS。在评论特定于 3.0 和更低版本的 SSL 技术时,将使用SSL。
SSL 与 TLS 版本
下表显示了 TLS 和 SSL 版本之间的关系。我听说过一些人谈论SSL 3.2 版本。但是,他们可能是从阅读博客中获得的术语。作为专业的管理员,我们总是希望使用标准术语。因此,谈论SSL 应该指的是过去的技术。一些简单的事情可以让一个 CentOS 求职者看起来像一个经验丰富的计算机科学专业毕业生。
TLS | SSL |
---|---|
- | 3.0 |
1.0 | 3.1 |
1.1 | 3.2 |
1.2 | 3.3 |
TLS 执行当今互联网用户重要的两个主要功能:一,验证一方的身份,称为身份验证。二,它为缺乏此原生功能的上层协议(ftp、http、电子邮件协议等)提供传输层的端到端加密。
首先,验证一方的身份,这对于端到端加密的安全至关重要。如果消费者与未授权进行支付的网站建立了加密连接,则财务数据仍然存在风险。这就是每个网络钓鱼网站都无法做到的:一个由受信任的CA正确签署的TLS证书,用于验证网站运营商的身份是否与其声称的身份一致。
只有两种方法可以绕过没有正确签署的证书:诱骗用户允许浏览器信任自签名证书,或者希望用户缺乏技术知识,不会知道受信任的证书颁发机构(或CA)的重要性。
在本教程中,我们将使用所谓的自签名证书。这意味着,如果没有明确地将此证书设置为访问该网站的每个Web浏览器的受信任状态,则会显示错误,阻止用户访问该站点。然后,它会让用户在访问具有自签名证书的站点之前执行一些操作。记住,为了安全起见,这是一件好事。
安装和配置openssl
openssl是TLS开源实现的标准。openssl用于Linux、BSD发行版、OS X等系统,甚至支持Windows。
openssl很重要,因为它提供了传输层安全,并为开发人员抽象了身份验证和端到端加密的详细编程。这就是为什么openssl几乎用于每个使用TLS的开源应用程序的原因。它也默认安装在每个现代版本的Linux上。
默认情况下,从CentOS 5版本开始就应该安装openssl。为了确保,让我们尝试通过YUM安装openssl。只需运行安装命令,因为YUM足够智能,可以让我们知道是否已安装软件包。如果由于兼容性原因我们运行的是旧版本的CentOS,则执行yum -y install将确保openssl针对最新的心脏滴血漏洞进行更新。
运行安装程序时,发现openssl实际上有更新。
[root@centos]# yum -y install openssl Resolving Dependencies --> Running transaction check ---> Package openssl.x86_64 1:1.0.1e-60.el7 will be updated ---> Package openssl.x86_64 1:1.0.1e-60.el7_3.1 will be an update --> Processing Dependency: openssl-libs(x86-64) = 1:1.0.1e-60.el7_3.1 for package: 1:openssl-1.0.1e-60.el7_3.1.x86_64 --> Running transaction check ---> Package openssl-libs.x86_64 1:1.0.1e-60.el7 will be updated ---> Package openssl-libs.x86_64 1:1.0.1e-60.el7_3.1 will be an update --> Finished Dependency Resolution Dependencies Resolved =============================================================================== =============================================================================== Package Arch Version Repository Size =============================================================================== =============================================================================== Updating: openssl x86_64 1:1.0.1e-60.el7_3.1 updates 713 k Updating for dependencies:
为OpenLDAP创建自签名证书
这是一种为我们之前的OpenLDAP安装创建自签名证书的方法。
创建OpenLDAP自签名证书。
openssl req -new -x509 -nodes -out /etc/openldap/certs/myldaplocal.pem -keyout /etc/openldap/certs/myldaplocal.pem -days 365 [root@centos]# openssl req -new -x509 -nodes -out /etc/openldap/certs/vmnet.pem -keyout /etc/openldap/certs/vmnet.pem -days 365 Generating a 2048 bit RSA private key .............................................+++ ................................................+++ writing new private key to '/etc/openldap/certs/vmnet.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:US State or Province Name (full name) []:Califonia Locality Name (eg, city) [Default City]:LA Organization Name (eg, company) [Default Company Ltd]:vmnet Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:centos Email Address []:[email protected] [root@centos]#
现在我们的OpenLDAP证书应该放在/etc/openldap/certs/目录下。
[root@centos]# ls /etc/openldap/certs/*.pem /etc/openldap/certs/vmnetcert.pem /etc/openldap/certs/vmnetkey.pem [root@centos]#
如您所见,我们已将证书和密钥都安装在/etc/openldap/certs/目录中。最后,我们需要更改每个文件的权限,因为它们当前归root用户所有。
[root@centos]# chown -R ldap:ldap /etc/openldap/certs/*.pem [root@centos]# ls -ld /etc/openldap/certs/*.pem -rw-r--r--. 1 ldap ldap 1395 Feb 20 10:00 /etc/openldap/certs/vmnetcert.pem -rw-r--r--. 1 ldap ldap 1704 Feb 20 10:00 /etc/openldap/certs/vmnetkey.pem [root@centos]#
为Apache Web服务器创建自签名证书
在本教程中,我们假设Apache已安装。我们在另一个教程(配置CentOS防火墙)中安装了Apache,并将把Apache的高级安装留到以后的教程中。因此,如果您尚未安装Apache,请继续阅读。
一旦安装Apache HTTPd,可以使用以下步骤:
步骤1 - 为Apache httpd服务器安装mod_ssl。
首先,我们需要使用mod_ssl配置Apache。使用YUM包管理器,这非常简单:
[root@centos]# yum -y install mod_ssl
然后重新加载Apache守护进程,以确保Apache使用新的配置。
[root@centos]# systemctl reload httpd
此时,Apache已配置为支持本地主机上的TLS连接。
步骤2 - 创建自签名ssl证书。
首先,让我们配置我们的私有TLS密钥目录。
[root@centos]# mkdir /etc/ssl/private [root@centos]# chmod 700 /etc/ssl/private/
注意 - 请确保只有root用户具有对此目录的读/写权限。如果具有世界读/写权限,则可以使用您的私钥解密嗅探到的流量。
生成证书和密钥文件。
[root@centos]# sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/self-gen-apache.key -out /etc/ssl/certs/self-sign-apache.crt Generating a 2048 bit RSA private key ..........+++ ....+++ ----- Country Name (2 letter code) [XX]:US State or Province Name (full name) []:xx Locality Name (eg, city) [Default City]:xxxx Organization Name (eg, company) [Default Company Ltd]:VMNET Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:centos.vmnet.local Email Address []: [root@centos]#
注意 - 如果您没有注册域名,可以使用服务器的公网IP地址。
让我们看看我们的证书:
[root@centos]# openssl x509 -in self-sign-apache.crt -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 17620849408802622302 (0xf489d52d94550b5e) Signature Algorithm: sha256WithRSAEncryption Issuer: C=US, ST=UT, L=xxxx, O=VMNET, CN=centos.vmnet.local Validity Not Before: Feb 24 07:07:55 2017 GMT Not After : Feb 24 07:07:55 2018 GMT Subject: C=US, ST=UT, L=xxxx, O=VMNET, CN=centos.vmnet.local Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:c1:74:3e:fc:03:ca:06:95:8d:3a:0b:7e:1a:56: f3:8d:de:c4:7e:ee:f9:fa:79:82:bf:db:a9:6d:2a: 57:e5:4c:31:83:cf:92:c4:e7:16:57:59:02:9e:38: 47:00:cd:b8:31:b8:34:55:1c:a3:5d:cd:b4:8c:b0: 66:0c:0c:81:8b:7e:65:26:50:9d:b7:ab:78:95:a5: 31:5e:87:81:cd:43:fc:4d:00:47:5e:06:d0:cb:71: 9b:2a:ab:f0:90:ce:81:45:0d:ae:a8:84:80:c5:0e: 79:8a:c1:9b:f4:38:5d:9e:94:4e:3a:3f:bd:cc:89: e5:96:4a:44:f5:3d:13:20:3d:6a:c6:4d:91:be:aa: ef:2e:d5:81:ea:82:c6:09:4f:40:74:c1:b1:37:6c: ff:50:08:dc:c8:f0:67:75:12:ab:cd:8d:3e:7b:59: e0:83:64:5d:0c:ab:93:e2:1c:78:f0:f4:80:9e:42: 7d:49:57:71:a2:96:c6:b8:44:16:93:6c:62:87:0f: 5c:fe:df:29:89:03:6e:e5:6d:db:0a:65:b2:5e:1d: c8:07:3d:8a:f0:6c:7f:f3:b9:32:b4:97:f6:71:81: 6b:97:e3:08:bd:d6:f8:19:40:f1:15:7e:f2:fd:a5: 12:24:08:39:fa:b6:cc:69:4e:53:1d:7e:9a:be:4b:
以下是我们使用openssl命令的每个选项的解释:
命令 | 操作 |
---|---|
req -X509 | 使用X.509 CSR管理PKI标准进行密钥管理。 |
-nodes | 不要使用密码保护我们的证书。Apache必须能够在不中断密码的情况下使用证书。 |
-days 2555 | 将证书的有效期设置为7年或2555天。时间段可以根据需要调整。 |
-newkey rsa:2048 | 指定使用RSA以2048位长度生成密钥和证书。 |
接下来,我们想为与客户端协商PFS创建一个Diffie-Hellman组。
[centos#] openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
这将花费5到15分钟。
完美前向保密 (Perfect Forward Secrecy) - 用于保护会话数据,以防私钥被泄露。这将生成一个在客户端和服务器之间使用的密钥,该密钥对于每个会话都是唯一的。
现在,将完美前向保密配置添加到我们的证书中。
[root@centos]# cat /etc/ssl/certs/dhparam.pem | tee -a /etc/ssl/certs/self-sign-apache.crt
配置Apache使用密钥和证书文件
我们将对/etc/httpd/conf.d/ssl.conf进行更改:
我们将对ssl.conf进行以下更改。但是,在这样做之前,我们应该备份原始文件。在使用像vi或emacs这样的高级文本编辑器更改生产服务器时,最好先备份配置文件然后再进行编辑。
[root@centos]# cp /etc/httpd/conf.d/ssl.conf ~/
现在,在我们已将已知可用的ssl.conf副本复制到主目录的根目录之后,让我们继续进行编辑。
- 找到
- 按如下方式编辑DocumentRoot和ServerName:
\\# General setup for the virtual host, inherited from global configuration DocumentRoot "/var/www/html" ServerName centos.vmnet.local:443
DocumentRoot 这是您默认Apache目录的路径。此文件夹中应该有一个默认页面,该页面将显示一个HTTP请求,请求您的Web服务器或站点的默认页面。例如:访问http://www.yoursite.com/ 将检索并提供来自您的DocumentRoot的index文件。
ServerName 是服务器名称,可以是IP地址或服务器的主机名。对于TLS,最好使用主机名创建证书。在我们之前的OpenLDAP教程中,我们在本地企业域中创建了主机名centos:vmnet.local
现在我们要注释掉以下几行:
SSLProtocol
# SSL Protocol support: # List the enable protocol levels with which clients will be able to # connect. Disable SSLv2 access by default: ~~~~> #SSLProtocol all -SSLv2 # SSL Cipher Suite: # List the ciphers that the client is permitted to negotiate. # See the mod_ssl documentation for a complete list. ~~~~> #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
然后让Apache知道在哪里可以找到我们的证书和私钥/公钥对。
指定我们自签名证书文件的路径
# Server Certificate: # Point SSLCertificateFile at a PEM encoded certificate. If # the certificate is encrypted, then you will be prompted for a # pass phrase. Note that a kill -HUP will prompt again. A new # certificate can be generated using the genkey(1) command. ~~~~> SSLCertificateFile /etc/ssl/certs/self-sign-apache.crt specify path to our private key file # Server Private Key: # If the key is not combined with the certificate, use this # directive to point at the key file. Keep in mind that if # you've both a RSA and a DSA private key you can configure # both in parallel (to also allow the use of DSA ciphers, etc.) ~~~~> SSLCertificateKeyFile /etc/ssl/private/self-gen-apache.key
最后,我们需要允许通过443端口进行入站https连接。
安装Apache Web服务器CentOS 7
在本章中,我们将简要了解Apache HTTP服务器的背景知识,然后在CentOS Linux 7上安装最新的稳定版本。
Apache Web服务器简史
Apache是一个存在了很长时间的Web服务器。事实上,几乎和http本身一样久远!
Apache最初是国家超级计算应用中心(也称为NCSA)的一个小型项目。在90年代中期,“httpd”(当时的名称)是互联网上最流行的Web服务器平台,市场份额约为90%或更高。
那时,这是一个简单的项目。被称为网站管理员的熟练IT人员负责:维护Web服务器平台和Web服务器软件以及前端和后端站点开发。httpd的核心是它能够使用称为插件或扩展的自定义模块。网站管理员也足够熟练,可以编写核心服务器软件的补丁。
在90年代中后期,httpd的资深开发者和项目经理离开了NCSA去做其他事情。这使得最流行的Web守护程序处于停滞状态。
由于httpd的使用非常广泛,一群经验丰富的httpd网站管理员呼吁举行关于httpd未来的峰会。决定协调并将最好的扩展和补丁应用到当前的稳定版本中。然后,当前的http服务器鼻祖诞生并被命名为Apache HTTP服务器。
鲜为人知的历史事实 - Apache并非以美洲原住民的某个部落命名。事实上,它的命名带有一个巧妙的转折:它是由许多才华横溢的计算机科学家提供的许多修复程序(或补丁)组成的:一个充满补丁的或Apache。
在CentOS Linux 7上安装当前稳定版本
步骤1 - 通过yum安装httpd。
yum -y install httpd
此时,Apache HTTP服务器将通过yum安装。
步骤2 - 根据您的httpd需求编辑httpd.conf文件。
默认的Apache安装中,Apache的配置文件名为httpd.conf,位于/etc/httpd/目录下。因此,让我们在vim中打开它。
在vim中打开的httpd.conf的前几行:
# # This is the main Apache HTTP server configuration file. It contains the # configuration directives that give the server its instructions. # See <URL:https://httpd.apache.org/docs/2.4/> for detailed information. # In particular, see # <URL:https://httpd.apache.org/docs/2.4/mod/directives.html> # for a discussion of each configuration directive.
我们将进行以下更改,以允许我们的CentOS安装通过http端口80提供http请求。
监听主机和端口
# Listen: Allows you to bind Apache to specific IP addresses and/or # ports, instead of the default. See also the <VirtualHost> # directive. # # Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses. # #Listen 12.34.56.78:80 Listen 80
在这里,我们将Apache更改为监听某个端口或IP地址。例如,如果我们想在备用端口(例如8080)上运行httpd服务。或者如果我们的Web服务器配置了多个具有独立IP地址的接口。
Listen
阻止Apache附加到每个监听守护程序到每个IP地址上。这对于停止仅指定IPv6或IPv4流量非常有用。或者甚至绑定到多宿主主机上的所有网络接口。
# # Listen: Allows you to bind Apache to specific IP addresses and/or # ports, instead of the default. See also the <VirtualHost> # directive. # # Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses. # Listen 10.0.0.25:80 #Listen 80
DocumentRoot
“文档根目录”是Apache在访问您的服务器时查找要提供请求的索引文件的默认目录:访问http://www.yoursite.com/ 将检索并提供来自您的文档根目录的index文件。
# # DocumentRoot: The directory out of which you will serve your # documents. By default, all requests are taken from this directory, but # symbolic links and aliases may be used to point to other locations. # DocumentRoot "/var/www/html"
步骤3 - 启动并启用httpd服务。
[root@centos rdc]# systemctl start httpd && systemctl reload httpd [root@centos rdc]#
步骤4 - 配置防火墙以允许访问端口80请求。
[root@centos]# firewall-cmd --add-service=http --permanent
Linux管理员 - 在CentOS 7上设置MySQL
正如在配置CentOS以与Maria DB一起使用时简要提到的那样,CentOS 7 yum存储库中没有原生的MySQL软件包。为此,我们需要添加一个MySQL托管存储库。
CentOS上的MariaDB与MySQL
需要注意的是,MySQL将需要与MariaDB不同的基本依赖项集。此外,使用MySQL会破坏CentOS的概念和理念:旨在最大限度提高可靠性的生产软件包。
因此,在决定使用Maria还是MySQL时,应该权衡以下两个选项:我的当前数据库模式是否适用于Maria?安装MySQL而不是Maria有什么优势?
Maria组件对于MySQL结构来说是100%透明的,并且效率更高,许可证也更好。除非出现令人信服的原因,否则建议将CentOS配置为使用MariaDB。
在CentOS上偏爱Maria的主要原因是:
大多数人将使用MariaDB。遇到问题时,您将获得更多关于Maria的帮助。
CentOS旨在与Maria一起运行。因此,Maria将提供更好的稳定性。
Maria获得CentOS的官方支持。
下载并添加MySQL存储库
我们将要从以下位置下载并安装MySQL存储库:
http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
步骤 1 − 下载仓库。
该仓库方便地打包在一个 rpm 包中,便于安装。可以使用 wget 下载 −
[root@centos]# wget http://repo.mysql.com/mysql-community-release-el75.noarch.rpm --2017-02-26 03:18:36-- http://repo.mysql.com/mysql-community-release-el75.noarch.rpm Resolving repo.mysql.com (repo.mysql.com)... 104.86.98.130
步骤 2 − 从 YUM 安装 MySQL。
现在我们可以使用 yum 包管理器来安装 MySQL −
[root@centos]# yum -y install mysql-server
步骤 3 − 启动并启用 MySQL 守护进程服务。
[root@centos]# systemctl start mysql [root@centos]# systemctl enable mysql
步骤 4 − 确保我们的 MySQL 服务正在运行。
[root@centos]# netstat -antup | grep 3306 tcp6 0 0 :::3306 :::* LISTEN 6572/mysqld [root@centos]#
注意 − 我们不会允许任何防火墙规则通过。通常情况下,MySQL 会配置为使用Unix 域套接字。这确保只有 LAMP 架构的 Web 服务器(本地)可以访问 MySQL 数据库,从而消除了数据库软件攻击向量的完整维度。
设置Postfix MTA和IMAP/POP3
为了从我们的 CentOS 7 服务器发送电子邮件,我们需要设置来配置一个现代邮件传输代理 (MTA)。邮件传输代理是负责通过 SMTP 为系统用户或企业互联网域名发送外发邮件的守护进程。
值得注意的是,本教程只讲解了设置本地使用的守护进程的过程。我们不会详细介绍为业务运营设置 MTA 的高级配置。这需要结合许多技能,包括但不限于:DNS、获取未被列入黑名单的静态可路由 IP 地址以及配置高级安全和服务设置。简而言之,本教程旨在让您熟悉基本配置。请勿将本教程用于面向互联网主机的 MTA 配置。
由于其兼顾安全性和易于管理的特点,我们选择Postfix作为本教程的 MTA。较旧版本的 CentOS 中安装的默认 MTA 是Sendmail。Sendmail是一个很棒的 MTA。但是,就作者个人拙见而言,Postfix 在解决 MTA 的以下注意事项时达到了一个最佳点。在最新版本的 CentOS 中,Postfix 已取代 Sendmail 成为默认 MTA。
Postfix 是一款广泛使用且文档齐全的 MTA。它得到积极维护和开发。它只需要最少的配置(这只是电子邮件),并且在系统资源方面效率很高(同样,这只是电子邮件)。
步骤 1 − 从 YUM 包管理器安装 Postfix。
[root@centos]# yum -y install postfix
步骤 2 − 配置 Postfix 配置文件。
Postfix 配置文件位于 − /etc/postfix/main.cf
在简单的 Postfix 配置中,必须为特定主机配置以下内容:主机名、域名、发件人、inet_interfaces 和目标。
配置主机名 − 主机名是 Postfix 主机的完全限定域名。在 OpenLDAP 章节中,我们将 CentOS 机器命名为:centos,域名是vmnet.local。让我们在本节中继续使用它。
# The myhostname parameter specifies the internet hostname of this # mail system. The default is to use the fully-qualified domain name # from gethostname(). $myhostname is used as a default value for many # other configuration parameters. # myhostname = centos.vmnet.local
配置域名 − 如上所述,本教程中将使用的域名是vmnet.local
# The mydomain parameter specifies the local internet domain name. # The default is to use $myhostname minus the first component. # $mydomain is used as a default value for many other configuration # parameters. # mydomain = vmnet.local
配置发件人 − 对于单服务器和域名设置,我们只需要取消注释以下部分并保留默认的 Postfix 变量。
# SENDING MAIL # # The myorigin parameter specifies the domain that locally-posted # mail appears to come from. The default is to append $myhostname, # which is fine for small sites. If you run a domain with multiple # machines, you should (1) change this to $mydomain and (2) set up # a domain-wide alias database that aliases each user to # [email protected]. # # For the sake of consistency between sender and recipient addresses, # myorigin also specifies the default domain name that is appended # to recipient addresses that have no @domain part. # myorigin = $myhostname myorigin = $mydomain
配置网络接口 − 我们将让 Postfix 监听我们的单个网络接口以及与该接口关联的所有协议和 IP 地址。这只需保留 Postfix 的默认设置即可。
# The inet_interfaces parameter specifies the network interface # addresses that this mail system receives mail on. By default, # the software claims all active interfaces on the machine. The # parameter also controls delivery of mail to user@[ip.address]. # # See also the proxy_interfaces parameter, for network addresses that # are forwarded to us via a proxy or network address translator. # # Note: you need to stop/start Postfix when this parameter changes. # #inet_interfaces = all #inet_interfaces = $myhostname #inet_interfaces = $myhostname, localhost #inet_interfaces = localhost # Enable IPv4, and IPv6 if supported inet_protocols = all
步骤 3 − 为 Postfix 配置 SASL 支持。
如果没有 SASL 身份验证支持,Postfix 将只允许从本地用户发送电子邮件。或者,当用户从本地域名之外发送电子邮件时,它会给出中继被拒绝错误。
注意 − SASL 或简单应用程序安全层框架是一个旨在支持不同应用程序层协议之间不同技术的身份验证框架。SASL 开发人员(和使用者)利用当前的身份验证协议来处理可能没有内置方便或更安全身份验证(在谈论对安全服务的访问时)的高级协议,而不是将身份验证机制留给应用程序层协议。
安装 "cyrus-sasl*" 包
[root@centos]# yum -y install cyrus-sasl Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: repos.forethought.net * extras: repos.dfw.quadranet.com * updates: mirrors.tummy.com Package cyrus-sasl-2.1.26-20.el7_2.x86_64 already installed and latest version Nothing to do
为 SASL Auth 配置/etc/postfix/main.cf
smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination smtpd_sasl_security_options = noanonymous smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth
我在main.conf中的 SASL 选项
##Configure SASL Options Entries: smtpd_sasl_auth_enable = yes smptd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination smtp_sasl_type = dovecot smtp_sasl_path = private/auth/etc
步骤 4 − 配置 FirewallD 以允许传入 SMTP 服务。
[root@centos]# firewall-cmd --permanent --add-service=smtp success [root@centos]# firewall-cmd --reload success [root@centos]#
现在让我们检查一下以确保我们的 CentOS 主机允许并在端口 25(SMTP)上响应请求。
Nmap scan report for 172.16.223.132 Host is up (0.00035s latency). Not shown: 993 filtered ports PORT STATE SERVICE 20/tcp closed ftp-data 21/tcp open ftp 22/tcp open ssh 25/tcp open smtp 80/tcp open http 389/tcp open ldap 443/tcp open https MAC Address: 00:0C:29:BE:DF:5F (VMware)
如您所见,SMTP 正在监听,并且守护进程正在响应来自我们内部 LAN 的请求。
安装 Dovecot IMAP 和 POP3 服务器
Dovecot 是一个安全的 IMAP 和 POP3 服务器,旨在处理中小型组织的传入邮件需求。由于它在 CentOS 中大量使用,我们将使用 Dovecot 作为在 CentOS 和 MTA SASL 提供程序上安装和配置传入邮件服务器的示例。
如前所述,我们不会为 DNS 配置 MX 记录,也不会创建允许我们的服务处理域邮件的安全规则。因此,仅在面向互联网的主机上设置这些服务可能会在没有 SPF 记录的情况下留下安全漏洞。
步骤 1 − 安装 Dovecot。
[root@centos]# yum -y install dovecot
步骤 2 − 配置 dovecot。
dovecot 的主要配置文件位于:/etc/dovecot.conf。我们首先备份主配置文件。在进行编辑之前始终备份配置文件是一个好习惯。这样,如果(例如)换行符被文本编辑器破坏,并且多年来的更改丢失了,则很容易通过将当前备份复制到生产环境来恢复。
启用dovecot的协议和守护进程服务
# Protocols we want to be serving. protocols = imap imaps pop3 pop3s
现在,我们需要启用 dovecot 守护进程在启动时监听 −
[root@localhost]# systemctl start dovecot [root@localhost]# systemctl enable dovecot
让我们确保 Dovecot 在为以下内容指定的端口上本地监听:imap、pop3、安全的 imap 和安全的 pop3。
[root@localhost]# netstat -antup | grep dovecot tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 4368/dovecot tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 4368/dovecot tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 4368/dovecot tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 4368/dovecot tcp6 0 0 :::110 :::* LISTEN 4368/dovecot tcp6 0 0 :::143 :::* LISTEN 4368/dovecot tcp6 0 0 :::993 :::* LISTEN 4368/dovecot tcp6 0 0 :::995 :::* LISTEN 4368/dovecot [root@localhost]#
如您所见,dovecot正在为 IPv4 和 IPv4 指定的端口上监听。
POP3 | 110 |
POP3s | 995 |
IMAP | 143 |
IMAPs | 993 |
现在,我们需要创建一些防火墙规则。
[root@localhost]# firewall-cmd --permanent --add-port=110/tcp success [root@localhost]# firewall-cmd --permanent --add-port=143/tcp success [root@localhost]# firewall-cmd --permanent --add-port=995/tcp success [root@localhost]# firewall-cmd --permanent --add-port=993/tcp success [root@localhost]# firewall-cmd --reload success [root@localhost]#
我们的传入邮件服务器正在接受对 LAN 上主机的POP3、POP3s、IMAP和IMAPs的请求。
Port Scanning host: 192.168.1.143 Open TCP Port: 21 ftp Open TCP Port: 22 ssh Open TCP Port: 25 smtp Open TCP Port: 80 http Open TCP Port: 110 pop3 Open TCP Port: 143 imap Open TCP Port: 443 https Open TCP Port: 993 imaps Open TCP Port: 995 pop3s
Linux 管理员 - 安装匿名 FTP
在深入研究在 CentOS 上安装 FTP 之前,我们需要了解一下它的用途和安全性。FTP是一种非常高效且经过完善的协议,用于在计算机系统之间传输文件。FTP 已经使用和完善了几十年了。对于通过具有延迟的网络高效传输文件或为了纯粹的速度,FTP 是一个不错的选择。比 SAMBA 或 SMB 都要好。
但是,FTP 确实存在一些安全问题。实际上,是一些严重的安全问题。FTP 使用一种非常弱的纯文本身份验证方法。出于这个原因,经过身份验证的会话应该依赖于 sFTP 或 FTPS,其中 TLS 用于登录和传输会话的端到端加密。
考虑到上述警告,普通的 FTP 今天仍在业务环境中使用。主要用途是匿名 FTP 文件存储库。在这种情况下,不需要身份验证即可下载或上传文件。匿名 FTP 使用的一些示例包括 −
大型软件公司仍然使用匿名 ftp 存储库,允许互联网用户下载共享软件和补丁。
允许互联网用户上传和下载公共文档。
某些应用程序会自动通过 FTP 将加密的存档日志或配置文件发送到存储库。
因此,作为 CentOS 管理员,能够安装和配置 FTP 仍然是一项重要的技能。
我们将使用名为vsFTP或非常安全的 FTP 守护程序的 FTP 守护程序。vsFTP 已经开发了一段时间了。它以安全、易于安装和配置以及可靠而闻名。
步骤 1 − 使用 YUM 包管理器安装 vsFTPd。
[root@centos]# yum -y install vsftpd.x86_64
步骤 2 − 配置 vsFTP 使用 systemctl 在启动时启动。
[root@centos]# systemctl start vsftpd [root@centos]# systemctl enable vsftpd Created symlink from /etc/systemd/system/multi- user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
步骤 3 − 配置 FirewallD 以允许 FTP 控制和传输会话。
[root@centos]# firewall-cmd --add-service=ftp --permanent success [root@centos]#
确保我们的 FTP 守护进程正在运行。
[root@centos]# netstat -antup | grep vsftp tcp6 0 0 :::21 :::* LISTEN 13906/vsftpd [root@centos]#
步骤 4 − 为 vsFTPD 配置匿名访问。
创建一个根 FTP 目录
[root@centos]# mkdir /ftp
将 FTP 根目录的所有者和组更改为ftp
[root@centos]# chown ftp:ftp /ftp Set minimal permissions for FTP root: [root@centos]# chmod -R 666 /ftp/ [root@centos]# ls -ld /ftp/ drw-rw-rw-. 2 ftp ftp 6 Feb 27 02:01 /ftp/ [root@centos]#
在这种情况下,我们授予用户对整个根 FTP 树的读写访问权限。
配置/etc/vsftpd/vsftpd.conf"
[root@centos]# vim /etc/vsftpd/vsftpd.conf # Example config file /etc/vsftpd/vsftpd.conf # # The default compiled in settings are fairly paranoid. This sample file # loosens things up a bit, to make the ftp daemon more usable. # Please see vsftpd.conf.5 for all compiled in defaults. # # READ THIS: This example file is NOT an exhaustive list of vsftpd options. # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's # capabilities.
我们希望更改vsftp.conf文件中的以下指令。
通过取消注释anon_mkdir_write_enable=YES启用匿名上传
将上传的文件所有者更改为系统ftp用户
chown_uploads = YES
chown_username = ftp
将 vsftp 使用的系统用户更改为 ftp 用户:nopriv_user = ftp
设置用户在登录前阅读的自定义横幅。
ftpd_banner = 欢迎使用我们的匿名 FTP 存储库。所有连接都会被监控和记录。
让我们只设置 IPv4 连接 −
listen = YES
listen_ipv6 = NO
现在,我们需要重新启动或HUP vsftp 服务以应用我们的更改。
[root@centos]# systemctl restart vsftpd
让我们连接到我们的 FTP 主机,并确保我们的 FTP 守护进程正在响应。
[root@centos rdc]# ftp 10.0.4.34 Connected to localhost (10.0.4.34). 220 Welcome to our Anonymous FTP Repo. All connections are monitored and logged. Name (localhost:root): anonymous 331 Please specify the password. Password: '230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp>
Linux 管理员 - 远程管理
在谈论 CentOS 中作为管理员的远程管理时,我们将探讨两种方法 −
- 控制台管理
- GUI 管理
远程控制台管理
远程控制台管理意味着通过 ssh 等服务通过命令行执行管理任务。要有效地使用 CentOS Linux 作为管理员,您需要熟练掌握命令行。Linux 的核心设计就是从控制台使用。即使在今天,一些系统管理员也更喜欢命令的强大功能,并通过运行没有物理终端且未安装 GUI 的精简版 Linux 机器来节省硬件成本。
远程 GUI 管理
远程 GUI 管理通常通过两种方式完成:远程 X 会话或 VNC 等 GUI 应用程序层协议。每种方法都有其优点和缺点。但是,在大多数情况下,VNC 是最好的管理选择。它允许从其他操作系统(例如 Windows 或 OS X)进行图形控制,这些操作系统本身不支持 X Windows 协议。
使用远程 X 会话是运行在 X 上的 X-Window 的窗口管理器和桌面管理器的原生功能。但是,整个 X 会话架构主要用于 Linux。并非每个系统管理员都会有 Linux 笔记本电脑来建立远程 X 会话。因此,最常见的是使用 VNC 服务器的适配版本。
VNC 最大的缺点是:VNC 本身不支持多用户环境,例如远程 X 会话。因此,对于最终用户的 GUI 访问,远程 X 会话是最佳选择。但是,我们主要关注的是远程管理 CentOS 服务器。
我们将讨论为多个管理员配置 VNC 与为数百个最终用户配置远程 X 会话的方案。
使用 SSH 打下远程控制台访问的安全基础
ssh 或 Secure Shell 现在是远程管理任何 Linux 服务器的标准方法。与 telnet 不同,SSH 使用 TLS 进行身份验证并对通信进行端到端加密。如果配置正确,管理员可以确信他们的密码和服务器在远程访问时都是安全的。
在配置 SSH 之前,让我们简单讨论一下基本安全性和最小权限访问。当 SSH 运行在其默认端口 22 上时;很快你就会遇到针对常用用户名和密码的暴力破解字典攻击。这是不可避免的。无论你将多少主机添加到你的拒绝文件,它们每天都会从不同的 IP 地址发起攻击。
通过一些常见的规则,你可以采取一些主动措施,让坏人浪费时间。以下是使用 SSH 进行生产服务器远程管理时应遵循的一些安全规则:
切勿使用常用用户名或密码。系统上的用户名不应是系统默认用户名,也不应与公司电子邮件地址相关联,例如:[email protected]
不允许通过 SSH 进行 root 访问或管理员访问。使用唯一的用户名,并在通过 SSH 身份验证后使用 su 切换到 root 或管理员帐户。
密码策略是必须的:使用复杂的 SSH 用户密码,例如:“This&IS&a&GUD&P@ssW0rd&24&me”。每隔几个月更改一次密码,以消除对增量暴力破解攻击的易感性。
禁用长时间未使用的帐户。例如,如果招聘经理的语音信箱显示一个月内不会进行面试,这可能会导致技术精湛且时间充裕的人有机可乘。
每天检查日志。作为系统管理员,每天早上至少花 30-40 分钟查看系统和安全日志。如果被问到,告诉每个人你没有时间不积极主动。这种做法将有助于在问题影响最终用户和公司利润之前隔离警告信号。
关于 Linux 安全性的说明 - 任何对 Linux 管理感兴趣的人都应该积极关注当前的网络安全新闻和技术。虽然我们大多听到的是其他操作系统被入侵,但对于网络罪犯来说,一个不安全的 Linux 系统是一个备受追捧的宝藏。凭借高速互联网连接上的 Linux 强大功能,熟练的网络罪犯可以使用 Linux 来利用其他操作系统的漏洞发起攻击。
安装和配置 SSH 以进行远程访问
步骤 1 - 安装 SSH 服务器和所有依赖包。
[root@localhost]# yum -y install openssh-server 'Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: repos.centos.net * extras: repos.dfw.centos.com * updates: centos.centos.com Resolving Dependencies --> Running transaction check ---> Package openssh-server.x86_64 0:6.6.1p1-33.el7_3 will be installed --> Finished Dependency Resolution Dependencies Resolved
步骤 2 - 创建一个安全的常规用户用于 shell 访问。
[root@localhost ~]# useradd choozer [root@localhost ~]# usermod -c "Remote Access" -d /home/choozer -g users -G wheel -a choozer
注意 - 我们将新用户添加到 wheel 组,这样在 SSH 身份验证后就可以 su 到 root 用户。我们还使用了在常用词表中找不到的用户名。这样,当 SSH 受到攻击时,我们的帐户就不会被锁定。
保存 sshd 服务器配置设置的文件是 /etc/ssh/sshd_config。
我们最初需要编辑的部分是:
LoginGraceTime 60m PermitRootLogin no
步骤 3 - 重新加载 SSH 守护进程 sshd。
[root@localhost]# systemctl reload sshd
最好将注销宽限期设置为 60 分钟。一些复杂的管理任务可能超过默认的 2 分钟。当配置或研究更改时,SSH 会话超时真是令人沮丧的事情。
步骤 4 - 让我们尝试使用 root 凭据登录。
bash-3.2# ssh centos.vmnet.local [email protected]'s password: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
步骤 5 - 我们现在无法再使用 root 凭据通过 ssh 远程登录。所以让我们登录到我们的非特权用户帐户,然后 su 到 root 帐户。
bash-3.2# ssh [email protected] [email protected]'s password: [choozer@localhost ~]$ su root Password: [root@localhost choozer]#
步骤 6 - 最后,让我们确保 SSHD 服务在启动时加载,并且 firewalld 允许外部 SSH 连接。
[root@localhost]# systemctl enable sshd [root@localhost]# firewall-cmd --permanent --add-service=ssh success [root@localhost]# firewall-cmd --reload success [root@localhost]#
SSH 现在已设置好并可用于远程管理。根据您的企业边界,可能需要配置数据包过滤边界设备以允许来自公司局域网外部的 SSH 远程管理。
配置 VNC 以进行远程 CentOS 管理
有几种方法可以在 CentOS 6-7 上通过 VNC 启用 CentOS 的远程管理。最简单但限制最多的一种方法是简单地使用名为 vino 的软件包。Vino 是一个为 Linux 设计的虚拟网络桌面连接应用程序,基于 Gnome 桌面平台。因此,假设安装已完成 Gnome 桌面。如果尚未安装 Gnome 桌面,请在继续之前安装。Vino 将默认情况下与 Gnome GUI 安装一起安装。
要在 Gnome 下使用 Vino 配置屏幕共享,我们需要进入 CentOS 系统首选项进行屏幕共享。
Applications->System Tools->Settings->Sharing
配置 VNC 桌面共享的说明:
禁用“新连接必须请求访问” - 此选项需要物理访问才能批准每个连接。此选项将阻止远程管理,除非有人在物理桌面前。
启用“需要密码” - 这与用户密码是分开的。它将控制对虚拟桌面的访问,并且仍然需要用户密码才能访问锁定的桌面(这对安全性很有好处)。
转发 UP&P 端口:如果可用,请保持禁用 - 转发 UP&P 端口将发送通用即插即用请求,以便 3 层设备自动允许 VNC 连接到主机。我们不想要这个。
确保 vino 正在 VNC 端口 5900 上监听。
[root@localhost]# netstat -antup | grep vino tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 4873/vino-server tcp6 0 0 :::5900 :::* LISTEN 4873/vino-server [root@localhost]#
现在让我们配置防火墙以允许传入的 VNC 连接。
[root@localhost]# firewall-cmd --permanent --add-port=5900/tcp success [root@localhost]# firewall-cmd --reload success [root@localhost rdc]#
最后,正如您所看到的,我们能够连接我们的 CentOS 系统并在 Windows 或 OS X 上使用 VNC 客户端进行管理。
遵守与我们为 SSH 制定的相同规则对于 VNC 同样重要。与 SSH 一样,VNC 不断地被扫描 IP 范围并测试弱密码。还值得注意的是,保留启用的默认 CentOS 登录名以及控制台超时有助于提高远程 VNC 安全性。由于攻击者需要 VNC 和用户密码,请确保屏幕共享密码不同,并且与用户密码一样难以猜测。
输入 VNC 屏幕共享密码后,我们还必须输入用户密码才能访问锁定的桌面。
安全说明 - 默认情况下,VNC 不是加密协议。因此,应通过 SSH 建立 VNC 连接隧道以进行加密。
设置通过 VNC 的 SSH 隧道
设置 SSH 隧道将提供 SSH 加密层以通过隧道传输 VNC 连接。另一个很棒的功能是它使用 SSH 压缩为 VNC GUI 屏幕更新添加另一层压缩。在处理 CentOS 服务器管理时,更安全和更快总是好的!
因此,从将启动 VNC 连接的客户端开始,让我们设置一个远程 SSH 隧道。在此演示中,我们使用的是 OS X。首先,我们需要使用 sudo -s 切换到 root 用户。
bash-3.2# sudo -s password:
输入用户密码,我们现在应该拥有带 # 提示符的 root shell -
bash-3.2#
现在,让我们创建我们的 SSH 隧道。
ssh -f [email protected] -L 2200:192.168.1.143:5900 -N
让我们分解这个命令:
ssh - 运行本地 ssh 实用程序
-f - 任务完全执行后,ssh 应在后台运行
[email protected] - 托管 VNC 服务的 CentOS 服务器上的远程 ssh 用户
-L 2200:192.168.1.143:5900 - 创建我们的隧道 [本地端口]:[远程主机]:[VNC 服务的远程端口]
-N 告诉 ssh 我们不希望在远程系统上执行命令
bash-3.2# ssh -f [email protected] -L 2200:192.168.1.143:5900 -N [email protected]'s password:
成功输入远程 ssh 用户的密码后,我们的 ssh 隧道 就创建好了。现在是精彩的部分!要连接,我们将 VNC 客户端指向本地主机上的隧道端口,在本例中为端口 2200。以下是 Mac 笔记本电脑的 VNC 客户端配置:
最后,我们的远程 VNC 桌面连接!
SSH 隧道的好处在于它几乎可以用于任何协议。SSH 隧道通常用于绕过 ISP 的出站和入站端口过滤,以及在规避其他会话层监控的同时欺骗应用程序层 IDS/IPS。
您的 ISP 可能会为非商业帐户过滤端口 5900,但允许在端口 22 上使用 SSH(如果端口 22 被过滤,则可以在任何端口上运行 SSH)。
应用程序级 IPS 和 IDS 会查看有效负载。例如,常见的缓冲区溢出或 SQL 注入。端到端 SSH 加密将加密应用程序层数据。
SSH 隧道是 Linux 管理员工具箱中完成任务的好工具。但是,作为管理员,我们希望探索限制特权较低的用户的 SSH 隧道访问权限。
管理安全说明 - 限制 SSH 隧道需要管理员进行思考。评估用户首先需要 SSH 隧道的理由;哪些用户需要隧道;以及实际的风险概率和最坏情况的影响。
这是一个高级主题,超出了中级入门指南的范围。建议那些希望达到 CentOS Linux 管理高级水平的人对这个主题进行研究。
使用 SSH 隧道进行远程 X-Windows
与 Windows 相比,Linux 中 X-Windows 的设计非常巧妙。如果我们想从另一台 Linux 机器控制远程 Linux 机器,我们可以利用 X 中内置的机制。
X-Windows(通常简称为“X”)提供了一种机制,可以将来自一台 Linux 机器上的应用程序窗口显示到另一台 Linux 机器上的 X 显示部分。因此,通过 SSH,我们可以请求将 X-Windows 应用程序转发到世界各地的另一台 Linux 机器的显示器!
要通过 ssh 隧道远程运行 X 应用程序,我们只需要运行一个命令:
[root@localhost]# ssh -X [email protected]
语法是 - ssh -X [用户]@[主机],并且主机必须运行具有有效用户的 ssh。
以下是通过远程 XWindows ssh 隧道在 Ubuntu 工作站上运行 GIMP 的屏幕截图。
从另一台 Linux 服务器或工作站远程运行应用程序非常简单。还可以通过几种方法启动整个 X 会话并远程拥有整个桌面环境。
XDMCP
无头软件包,例如 NX
在X和GNOME或KDE等桌面管理器中配置备用显示器和桌面
此方法最常用于没有物理显示器的无头服务器,并且确实超出了中级入门指南的范围。但是,了解可用的选项仍然很有益。
Linux管理员 - CentOS中的流量监控
有一些第三方工具可以增强CentOS流量监控的功能。在本教程中,我们将重点介绍CentOS主发行版存储库和Fedora EPEL存储库中打包的那些工具。
总有一些情况,管理员(由于某种原因)只能使用CentOS主存储库中的工具。讨论的大多数实用程序都设计供管理员通过shell进行物理访问使用。当使用可访问的web-gui进行流量监控时,使用ntop-ng或Nagios等第三方实用程序是最佳选择(而不是从头创建此类工具)。
有关可配置web-gui解决方案的更多研究,以下是一些入门研究的链接。
局域网/广域网流量监控
Nagios
Nagios已经存在很长时间了,因此它经过了验证。曾经它完全是免费和开源的,但后来发展成为一个企业解决方案,并采用付费许可模式来满足企业复杂性的需求。因此,在计划任何使用Nagios的部署之前,请确保开源许可版本能够满足您的需求,或者计划预算用于企业级解决方案。
大多数开源Nagios流量监控软件都可以在以下网站找到:− https://www.nagios.org
有关Nagios的简要历史,请访问Nagios官方历史页面:https://www.nagios.org/about/history/
ntopng
另一个很棒的工具,允许通过web-gui进行带宽和流量监控,称为ntopng。ntopng类似于Unix实用程序ntop,可以收集整个局域网或广域网的数据。提供用于管理、配置和制图的web-gui,使整个IT部门易于使用。
与Nagios一样,ntopng也有开源和付费企业版可用。有关ntopng的更多信息,请访问以下网站:− http://www.ntop.org/
安装Fedora EPEL存储库 ─ 企业版Linux的额外软件包
要访问流量监控所需的一些工具,我们需要将CentOS系统配置为使用EPEL存储库。
EPEL存储库并非由CentOS官方维护或支持。但是,它由一群Fedora Core志愿者维护,以解决企业Linux专业人员常用的软件包,这些软件包未包含在CentOS、Fedora Core或Red Hat Enterprise Linux中。
警告
请记住,EPEL存储库并非CentOS官方存储库,可能会破坏生产服务器上具有公共依赖项的兼容性和功能。考虑到这一点,建议您始终在运行与生产服务器相同服务的非生产服务器上进行测试,然后再部署到关键系统。
实际上,与CentOS的任何其他第三方存储库相比,使用EHEL存储库的最大优势是我们可以确保二进制文件未被篡改。不使用来自不受信任来源的存储库被认为是最佳实践。
综上所述,EPEL官方存储库在CentOS中非常常见,可以通过YUM轻松安装。
[root@CentOS rdc]# yum -y install epel-release Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: repo1.dal.innoscale.net * extras: repo1.dal.innoscale.net * updates: mirror.hmc.edu Resolving Dependencies --> Running transaction check ---> Package epel-release.noarch 0:7-9 will be installed --> Finished Dependency Resolution Dependencies Resolved --{ condensed output }--
安装EPEL存储库后,我们需要更新它。
[root@CentOS rdc]# yum repolist Loaded plugins: fastestmirror, langpacks epel/x86_64/metalink | 11 kB 00:00:00 epel | 4.3 kB 00:00:00 (1/3): epel/x86_64/group_gz | 170 kB 00:00:00 (2/3): epel/x86_64/updateinfo | 753 kB 00:00:01 (3/3): epel/x86_64/primary_db --{ condensed output }--
此时,我们的EPEL存储库应该已配置并可以使用。让我们首先安装nload来监控接口带宽。
本教程将重点介绍以下工具:
- nload
- ntop
- ifstst
- iftop
- vnstat
- net hogs
- Wireshark
- TCP Dump
- Traceroute
这些都是Linux企业中监控流量的标准工具。每个工具的使用范围从简单到高级不等,因此我们只简要讨论Wireshark和TCP Dump等工具。
安装和使用nload
在CentOS中安装和配置EPEL存储库后,我们现在应该能够安装和使用nload。此实用程序旨在实时绘制每个接口的带宽。
与大多数其他基本安装一样,nload是通过YUM包管理器安装的。
[root@CentOS rdc]# yum -y install nload Resolving Dependencies --> Running transaction check ---> Package nload.x86_64 0:0.7.4-4.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved =============================================================================== =============================================================================== Package Arch Version Repository Size =============================================================================== =============================================================================== Installing: nload x86_64 0.7.4-4.el7 epel 70 k Transaction Summary =============================================================================== =============================================================================== Install 1 Package Total download size: 70 k Installed size: 176 k Downloading packages: --{ condensed output }--
现在我们已经安装了nload,使用它非常简单。
[root@CentOS rdc]# nload enp0s5
nload将监控指定的接口。在本例中,enp0s5是一个以太网接口,它将实时从终端监控网络流量负载和总带宽使用情况。
如所见,nload将绘制指定接口的传入和传出数据,并提供带井号“#”的数据流的物理表示。
所示截图显示了一个简单的网页加载,其中包含一些后台守护程序流量。
nload的常用命令行开关:
命令 | 操作 |
---|---|
-a | 时间段 |
-t | 时间更新间隔(毫秒),默认为500 |
-u | 设置流量测量单位的显示 h |
-U | 设置总的输入/输出流量测量单位,选项与-u相同 |
nload的标准语法:
nload [options] <interface>
如果未指定接口,nload将自动获取第一个以太网接口。让我们尝试以兆字节为单位测量总数据输入/输出,并以兆位为单位测量当前数据传输速度。
[root@CentOS rdc]# nload -U M -u m
当前接口的传入/传出数据以兆比特每秒为单位测量,每行“Ttl”表示总的传入/传出数据,以兆字节显示。
nload可帮助管理员查看有多少数据已通过接口以及当前有多少数据正在传入/传出指定的接口。
要查看其他接口而不关闭nload,只需使用左右箭头键。这将循环遍历系统上所有可用的接口。
可以使用-m开关同时监控多个接口:
[root@CentOS rdc]# nload -u K -U M -m lo -m enp0s5
nload同时监控两个接口(lo和enp0s5):
Linux管理员 - 日志管理
systemd改变了CentOS Linux系统日志的管理方式。系统上的每个守护程序不再将日志放置在单独的位置,然后使用tail或grep等工具作为排序和过滤日志条目的主要方式,而journald则为分析系统日志带来了单点管理。
systemd日志记录背后的主要组件是:journal、jounralctl和journald.conf
journald是主要的日志记录守护程序,通过编辑journald.conf进行配置,而journalctl用于分析journald记录的事件。
journald记录的事件包括:内核事件、用户进程和守护程序服务。
设置正确的系统时区
在使用journalctl之前,我们需要确保系统时间设置为正确的时间。为此,我们需要使用timedatectl。
让我们检查当前的系统时间。
[root@centos rdc]# timedatectl status Local time: Mon 2017-03-20 00:14:49 MDT Universal time: Mon 2017-03-20 06:14:49 UTC RTC time: Mon 2017-03-20 06:14:49 Time zone: America/Denver (MDT, -0600) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: yes Last DST change: DST began at Sun 2017-03-12 01:59:59 MST Sun 2017-03-12 03:00:00 MDT Next DST change: DST ends (the clock jumps one hour backwards) at Sun 2017-11-05 01:59:59 MDT Sun 2017-11-05 01:00:00 MST [root@centos rdc]#
目前,系统时间与本地时区一致。如果您的系统时间不正确,让我们设置正确的时区。更改设置后,CentOS将自动计算当前时区的时区偏移量,立即调整系统时钟。
让我们使用timedatectl列出所有时区:
[root@centos rdc]# timedatectl list-timezones Africa/Abidjan Africa/Accra Africa/Addis_Ababa Africa/Algiers Africa/Asmara Africa/Bamako Africa/Bangui Africa/Banjul Africa/Bissau
这是timedatectl list-timezones的输出结果。要查找特定的本地时区,可以使用grep命令:
[root@centos rdc]# timedatectl list-timezones | grep -i "america/New_York" America/New_York [root@centos rdc]#
CentOS使用的标签通常是国家/地区,使用下划线而不是空格(New_York而不是“New York”)。
现在让我们设置我们的时区:
[root@centos rdc]# timedatectl set-timezone "America/New_York" [root@centos rdc]# date Mon Mar 20 02:28:44 EDT 2017 [root@centos rdc]#
您的系统时钟应该会自动调整时间。
使用journalctl分析日志
使用journalctl时的常用命令行开关:
开关 | 操作 |
---|---|
-k | 仅列出内核消息 |
-u | 按特定单元列出(httpd、sshd等…) |
-b | 引导标签偏移量 |
-o | 日志输出格式 |
-p | 按日志类型过滤(名称或编号) |
-F | 字段名或字段名值 |
--utc | UTC偏移时间 |
--since | 按时间范围过滤 |
检查引导日志
首先,我们将检查和配置CentOS Linux中的引导日志。您首先会注意到,CentOS默认情况下不存储跨重启的持久引导日志。
要检查每次重启的引导日志,我们可以发出以下命令:
[root@centos rdc]# journalctl --list-boots -4 bca6380a31a2463aa60ba551698455b5 Sun 2017-03-19 22:01:57 MDT—Sun 2017-03-19 22:11:02 MDT -3 3aaa9b84f9504fa1a68db5b49c0c7208 Sun 2017-03-19 22:11:09 MDT—Sun 2017-03-19 22:15:03 MDT -2 f80b231272bf48ffb1d2ce9f758c5a5f Sun 2017-03-19 22:15:11 MDT—Sun 2017-03-19 22:54:06 MDT -1 a071c1eed09d4582a870c13be5984ed6 Sun 2017-03-19 22:54:26 MDT—Mon 2017-03-20 00:48:29 MDT 0 9b4e6cdb43b14a328b1fa6448bb72a56 Mon 2017-03-20 00:48:38 MDT—Mon 2017-03-20 01:07:36 MDT [root@centos rdc]#
重启系统后,我们可以看到另一个条目。
[root@centos rdc]# journalctl --list-boots -5 bca6380a31a2463aa60ba551698455b5 Sun 2017-03-19 22:01:57 MDT—Sun 2017-03-19 22:11:02 MDT -4 3aaa9b84f9504fa1a68db5b49c0c7208 Sun 2017-03-19 22:11:09 MDT—Sun 2017-03-19 22:15:03 MDT -3 f80b231272bf48ffb1d2ce9f758c5a5f Sun 2017-03-19 22:15:11 MDT—Sun 2017-03-19 22:54:06 MDT -2 a071c1eed09d4582a870c13be5984ed6 Sun 2017-03-19 22:54:26 MDT—Mon 2017-03-20 00:48:29 MDT -1 9b4e6cdb43b14a328b1fa6448bb72a56 Mon 2017-03-20 00:48:38 MDT—Mon 2017-03-20 01:09:57 MDT 0 aa6aaf0f0f0d4fcf924e17849593d972 Mon 2017-03-20 01:10:07 MDT—Mon 2017-03-20 01:12:44 MDT [root@centos rdc]#
现在,让我们检查上次引导日志:
root@centos rdc]# journalctl -b -5 -- Logs begin at Sun 2017-03-19 22:01:57 MDT, end at Mon 2017-03-20 01:20:27 MDT. -- Mar 19 22:01:57 localhost.localdomain systemd-journal[97]: Runtime journal is using 8.0M (max allowed 108.4M Mar 19 22:01:57 localhost.localdomain kernel: Initializing cgroup subsys cpuset Mar 19 22:01:57 localhost.localdomain kernel: Initializing cgroup subsys cpu Mar 19 22:01:57 localhost.localdomain kernel: Initializing cgroup subsys cpuacct Mar 19 22:01:57 localhost.localdomain kernel: Linux version 3.10.0514.6.2.el7.x86_64 ([email protected]. Mar 19 22:01:57 localhost.localdomain kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-514.6.2.el7.x86_64 ro Mar 19 22:01:57 localhost.localdomain kernel: Disabled fast string operations Mar 19 22:01:57 localhost.localdomain kernel: e820: BIOS-provided physical RAM map:
以上是上次引导的简化输出。我们还可以参考数小时、数天、数周、数月甚至数年前的引导日志。但是,CentOS默认情况下不存储持久引导日志。要启用持久存储引导日志,我们需要进行一些配置更改:
- 创建引导日志的中央存储点
- 为新的日志文件夹赋予正确的权限
- 配置journald.conf以进行持久日志记录
配置持久引导日志的引导位置
journald最初想要存储持久引导日志的位置是/var/log/journal。由于默认情况下不存在此位置,让我们创建它:
[root@centos rdc]# mkdir /var/log/journal
现在,让我们为目录赋予journald守护程序访问权限:
systemd-tmpfiles --create --prefix /var/log/journal
最后,让我们告诉journald它应该存储持久引导日志。在vim或您喜欢的文本编辑器中,打开/etc/systemd/jounrald.conf"。
# See journald.conf(5) for details. [Journal]=Storage=peristent
我们关注的行是Storage=。首先删除注释#,然后更改为Storage = persistent,如上所示。保存并重启CentOS系统,注意运行journalctl list-boots时应该有多个条目。
注意 − 来自VPS提供商的不断变化的machine-id可能会导致journald无法存储持久引导日志。对于这种情况,有很多解决方法。最好仔细阅读CentOS管理员论坛上发布的当前修复程序,然后遵循那些找到可行VPS解决方法的人的可靠建议。
要检查特定的引导日志,我们只需要使用journald --list-boots获取每个偏移量,然后使用-b开关加上偏移量。因此,要检查第二个引导日志,我们将使用:
journalctl -b -2
如果未指定引导日志偏移量,-b的默认值始终是上次重启后的当前引导日志。
按日志类型分析日志
journald的事件编号并分为7种不同的类型:
0 - emerg :: System is unusable 1 - alert :: Action must be taken immediatly 2 - crit :: Action is advised to be taken immediatly 3 - err :: Error effecting functionality of application 4 - warning :: Usually means a common issue that can affect security or usilbity 5 - info :: logged informtation for common operations 6 - debug :: usually disabled by default to troubleshoot functionality
因此,如果我们想查看所有警告,可以通过journalctl发出以下命令:
[root@centos rdc]# journalctl -p 4 -- Logs begin at Sun 2017-03-19 22:01:57 MDT, end at Wed 2017-03-22 22:33:42 MDT. -- Mar 19 22:01:57 localhost.localdomain kernel: ACPI: RSDP 00000000000f6a10 00024 (v02 PTLTD ) Mar 19 22:01:57 localhost.localdomain kernel: ACPI: XSDT 0000000095eea65b 0005C (v01 INTEL 440BX 06040000 VMW 01 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: FACP 0000000095efee73 000F4 (v04 INTEL 440BX 06040000 PTL 00 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: DSDT 0000000095eec749 1272A (v01 PTLTD Custom 06040000 MSFT 03 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: FACS 0000000095efffc0 00040 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: BOOT 0000000095eec721 00028 (v01 PTLTD $SBFTBL$ 06040000 LTP 00 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: APIC 0000000095eeb8bd 00742 (v01 PTLTD ? APIC 06040000 LTP 00 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: MCFG 0000000095eeb881 0003C (v01 PTLTD $PCITBL$ 06040000 LTP 00 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: SRAT 0000000095eea757 008A8 (v02 VMWARE MEMPLUG 06040000 VMW 00 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: HPET 0000000095eea71f 00038 (v01 VMWARE VMW HPET 06040000 VMW 00 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: WAET 0000000095eea6f7 00028 (v01 VMWARE VMW WAET 06040000 VMW 00 Mar 19 22:01:57 localhost.localdomain kernel: Zone ranges: Mar 19 22:01:57 localhost.localdomain kernel: DMA [mem 0x000010000x00ffffff] Mar 19 22:01:57 localhost.localdomain kernel: DMA32 [mem 0x010000000xffffffff] Mar 19 22:01:57 localhost.localdomain kernel: Normal empty Mar 19 22:01:57 localhost.localdomain kernel: Movable zone start for each node Mar 19 22:01:57 localhost.localdomain kernel: Early memory node ranges Mar 19 22:01:57 localhost.localdomain kernel: node 0: [mem 0x000010000x0009dfff] Mar 19 22:01:57 localhost.localdomain kernel: node 0: [mem 0x001000000x95edffff] Mar 19 22:01:57 localhost.localdomain kernel: node 0: [mem 0x95f000000x95ffffff] Mar 19 22:01:57 localhost.localdomain kernel: Built 1 zonelists in Node order, mobility grouping on. Total pages: 60 Mar 19 22:01:57 localhost.localdomain kernel: Policy zone: DMA32 Mar 19 22:01:57 localhost.localdomain kernel: ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
以上显示了系统过去4天中的所有警告。
使用systemd查看和浏览日志的新方法确实需要一些练习和研究才能熟悉。但是,凭借不同的输出格式,并特别注意使所有打包的守护程序日志通用化,它值得采用。journald比传统的日志分析方法提供了更大的灵活性和效率。
Linux管理员 - 备份与恢复
在探索CentOS中部署标准备份计划的特定方法之前,让我们首先讨论标准级别备份策略的典型考虑因素。我们首先要习惯的是3-2-1备份规则。
3-2-1备份策略
在整个行业中,您经常会听到3-2-1备份模型这个术语。在实施备份计划时,这是一个非常好的方法。3-2-1定义如下:3份数据副本;例如,我们可能有工作副本;使用rsync在CentOS服务器上设计的冗余副本;并从备份服务器上的数据进行轮换的异地USB备份。2种不同的备份介质。在这种情况下,我们实际上将拥有三种不同的备份介质:笔记本电脑或工作站SSD上的工作副本,RADI6阵列上的CentOS服务器数据以及放在USB驱动器上的异地备份。1份异地数据副本;我们正在每晚轮换异地USB驱动器。另一种现代方法可能是云备份提供商。
系统恢复
裸机恢复计划仅仅是CentOS管理员制定的一个计划,用于使关键系统在线并保持所有数据完整。假设100%的系统故障和所有过去系统硬件的丢失,管理员必须有一个计划来实现正常运行时间,并保持用户数据完整,同时最大限度地减少停机时间。Linux中使用的单内核实际上使得使用系统映像进行裸机恢复比Windows更容易。而Windows使用的是微内核架构。
完整的 数据恢复和裸机恢复通常是通过多种方法组合完成的,包括关键运行服务器的工作配置生产磁盘映像,遵守3-2-1规则的用户数据的冗余备份。甚至一些敏感文件也可能存储在安全的防火安全柜中,只有值得信赖的公司人员才能有限地访问。
使用原生CentOS工具的多阶段裸机恢复和数据恢复计划可能包括:
使用dd创建和恢复已配置服务器的生产磁盘映像
使用rsync制作所有用户数据的增量备份
使用tar & gzip存储带有管理员密码和注释的加密备份文件。通常,这可以放在USB驱动器上,加密并锁在一个高级经理可以访问的安全柜中。此外,这还可以确保如果当前管理员中了彩票并消失到某个阳光明媚的岛屿上,其他人也会知道重要的安全凭据。
如果系统由于硬件故障或灾难而崩溃,则恢复操作的不同阶段如下:
使用已配置的裸机映像构建工作服务器
从备份中将数据恢复到工作服务器
可以物理访问执行前两个操作所需的凭据
使用rsync进行文件级备份
rsync是一个用于在本地或其他服务器之间同步文件目录的强大实用程序。系统管理员多年来一直在使用rsync,因此它对于备份数据非常完善。在我看来,sync最好的功能之一是它可以从命令行进行脚本化。
在本教程中,我们将以各种方式讨论rsync:
- 探讨和讨论一些常见选项
- 创建本地备份
- 通过SSH创建远程备份
- 恢复本地备份
rsync的名称来源于其用途:远程同步,它功能强大且灵活。
以下是通过ssh进行的基本rsync远程备份:
MiNi:~ rdc$ rsync -aAvz --progress ./Desktop/ImportantStuff/ [email protected]:home/rdc/ Documents/RemoteStuff/ [email protected]'s password: sending incremental file list 6,148 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=23/25) 2017-02-14 16_26_47-002 - Veeam_Architecture001.png 33,144 100% 31.61MB/s 0:00:00 (xfr#2, to-chk=22/25) A Guide to the WordPress REST API | Toptal.pdf 892,406 100% 25.03MB/s 0:00:00 (xfr#3, to-chk=21/25) Rick Cardon Technologies, LLC..webloc 77 100% 2.21kB/s 0:00:00 (xfr#4, to-chk=20/25) backbox-4.5.1-i386.iso 43,188,224 1% 4.26MB/s 0:08:29 sent 2,318,683,608 bytes received 446 bytes 7,302,941.90 bytes/sec total size is 2,327,091,863 speedup is 1.00 MiNi:~ rdc$
以下同步通过我们的局域网发送了近2.3GB的数据。rsync的美妙之处在于它在文件的基础上以块级别增量工作。这意味着,如果我们在1MB的文本文件中只更改了两个字符,那么在下一次同步时,只有1个或2个块将通过局域网传输!
此外,可以禁用增量功能,以便使用更多的网络带宽来减少CPU利用率。如果每10分钟在1Gb专用备份局域网上不断复制多个10MB的数据库文件,这可能被证明是可取的。原因是:这些文件将始终发生变化,并将每10分钟增量传输,这可能会增加远程CPU的负载。由于总传输负载不会超过5分钟,我们可能只想完整地同步数据库文件。
以下是rsync最常见的开关:
rsync syntax: rsync [options] [local path] [[remote host:remote path] or [target path
开关 | 操作 |
---|---|
-a | 存档模式,包含-r、-p、-t、-g、-l |
-d | 仅同步目录树,不包含文件 |
-r | 递归进入目录 |
-l | 将符号链接复制为符号链接 |
-p | 保留权限 |
-g | 保留组 |
-v | 详细输出 |
-z | 通过网络链接压缩 |
-X | 保留扩展属性 |
-A | 保留ACL |
-t | 保留时间戳 |
-W | 传输整个文件,而不是增量块 |
-u | 不要覆盖目标上的文件 |
--progress | 显示传输进度 |
--delete | 删除目标上的旧文件 |
--max-size = XXX | 要同步的最大文件大小 |
何时使用rsync
我个人更喜欢在将文件从源主机备份到目标主机时使用rsync。例如,所有用于数据恢复的主目录,甚至用于灾难恢复的异地和云端。
使用rsync进行本地备份
我们已经看到了如何将文件从一台主机传输到另一台主机。相同的方法可用于在本地同步目录和文件。
让我们手动对root用户目录中的/etc/进行增量备份。
首先,我们需要在~/root下为同步备份创建一个目录:
[root@localhost rdc]# mkdir /root/etc_baks
然后,确保有足够的可用磁盘空间。
[root@localhost rdc]# du -h --summarize /etc/ 49M /etc/ [root@localhost rdc]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/cl-root 43G 15G 28G 35% /
我们可以同步整个/etc/目录:
rsync -aAvr /etc/ /root/etc_baks/
我们同步的/etc/目录:
[root@localhost etc_baks]# ls -l ./ total 1436 drwxr-xr-x. 3 root root 101 Feb 1 19:40 abrt -rw-r--r--. 1 root root 16 Feb 1 19:51 adjtime -rw-r--r--. 1 root root 1518 Jun 7 2013 aliases -rw-r--r--. 1 root root 12288 Feb 27 19:06 aliases.db drwxr-xr-x. 2 root root 51 Feb 1 19:41 alsa drwxr-xr-x. 2 root root 4096 Feb 27 17:11 alternatives -rw-------. 1 root root 541 Mar 31 2016 anacrontab -rw-r--r--. 1 root root 55 Nov 4 12:29 asound.conf -rw-r--r--. 1 root root 1 Nov 5 14:16 at.deny drwxr-xr-x. 2 root root 32 Feb 1 19:40 at-spi2 --{ condensed output }--
现在让我们进行增量rsync:
[root@localhost etc_baks]# rsync -aAvr --progress /etc/ /root/etc_baks/ sending incremental file list test_incremental.txt 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=1145/1282) sent 204620 bytes received 2321 bytes 413882.00 bytes/sec total size is 80245040 speedup is 387.77 [root@localhost etc_baks]#
只有我们的test_incremental.txt文件被复制。
使用rsync进行远程差分备份
让我们将初始rsync完整备份到已部署备份计划的服务器上。此示例实际上是将Mac OS X工作站上的文件夹备份到CentOS服务器。rsync的另一个优点是它可以用于任何已移植rsync的平台。
MiNi:~ rdc$ rsync -aAvz Desktop/ImportanStuff/ [email protected]:Documents/RemoteStuff [email protected]'s password: sending incremental file list ./ A Guide to the WordPress REST API | Toptal.pdf Rick Cardon Tech LLC.webloc VeeamDiagram.png backbox-4.5.1-i386.iso dhcp_admin_script_update.py DDWRT/ DDWRT/.DS_Store DDWRT/ddwrt-linksys-wrt1200acv2-webflash.bin DDWRT/ddwrt_mod_notes.docx DDWRT/factory-to-ddwrt.bin open_ldap_config_notes/ open_ldap_config_notes/ldap_directory_a.png open_ldap_config_notes/open_ldap_notes.txt perl_scripts/ perl_scripts/mysnmp.pl php_scripts/ php_scripts/chunked.php php_scripts/gettingURL.php sent 2,318,281,023 bytes received 336 bytes 9,720,257.27 bytes/sec total size is 2,326,636,892 speedup is 1.00 MiNi:~ rdc$
我们现在已将工作站上的文件夹备份到运行RAID6卷的服务器上,并对异地存储的轮换灾难恢复介质进行了备份。使用rsync使我们仅使用一台具有昂贵冗余磁盘阵列和轮换差分备份的服务器就实现了标准的3-2-1备份。
现在,让我们在添加名为test_file.txt的单个新文件后,使用rsync再次备份同一文件夹。
MiNi:~ rdc$ rsync -aAvz Desktop/ImportanStuff/ [email protected]:Documents/RemoteStuff [email protected]'s password: sending incremental file list ./ test_file.txt sent 814 bytes received 61 bytes 134.62 bytes/sec total size is 2,326,636,910 speedup is 2,659,013.61 MiNi:~ rdc$
正如您所看到的,只有新文件通过rsync传递到服务器。文件比较是在逐文件的基础上进行的。
需要注意的是:这只会复制新文件:test_file.txt,因为它只是唯一更改的文件。rsync使用ssh。我们不需要在任何一台机器上使用root帐户。
rsync简单、强大且有效,非常适合备份整个文件夹和目录结构。但是,rsync本身并不自动化此过程。我们需要深入研究我们的工具箱,找到最适合这项工作的简单工具。
要使用cronjobs自动执行rsync备份,必须使用SSH密钥进行身份验证来设置SSH用户。这与cronjobs相结合,使rsync能够按定时间隔自动执行。
使用DD进行逐块裸机恢复映像
DD是一个Linux实用程序,自从Linux内核满足GNU实用程序以来就存在了。
dd最简单的说法是复制选定磁盘区域的映像。然后提供复制物理磁盘选定块的能力。因此,除非您有备份,否则一旦dd覆盖磁盘,所有块都将被替换。即使是价格昂贵的高级数据恢复也无法恢复以前的数据丢失。
使用dd创建可启动系统映像的整个过程如下:
- 从具有可启动Linux发行版的CentOS服务器启动
- 查找要成像的可启动磁盘的名称
- 确定存储恢复映像的位置
- 查找磁盘上使用的块大小
- 启动dd映像操作
在本教程中,为了节省时间和简便起见,我们将从CentOS虚拟机创建主引导记录的ISO映像。然后,我们将此映像存储在异地。如果我们的MBR损坏且需要恢复,则可以将相同的过程应用于整个可启动磁盘或分区。但是,对于本教程来说,所需的时间和磁盘空间确实有点过分了。
鼓励CentOS管理员在测试环境中熟练掌握恢复完全可启动的磁盘/分区并执行裸机恢复。当最终需要在现实生活中与管理人员和几十个最终用户一起进行练习时,这将减轻很多压力。在这种情况下,10分钟的摸索时间似乎像一个永恒,让人汗流浃背。
注意:使用dd时,请确保不要混淆源卷和目标卷。您可以通过将备份位置复制到启动驱动器来破坏数据和可启动服务器。或者,可能更糟糕的是,使用DD在非常低的级别覆盖数据,从而永远破坏数据。
以下是dd常见的命令行开关和参数:
开关 | 操作 |
---|---|
if= | 要复制的输入文件或源 |
of= | 输出文件或输入文件的副本 |
bs | 设置输入和输出块大小 |
obs | 设置输出文件块大小 |
ibs | 设置输入文件块大小 |
count | 设置要复制的块数 |
conv | 要添加的额外成像选项 |
Noerror | 不要停止处理错误 |
同步 | 如果发生错误或未对齐,则填充不合适的输入块 |
关于块大小的说明 − dd 的默认块大小为 512 字节。这是较低密度硬盘的标准块大小。如今,更高密度硬盘的块大小已增加到 4096 字节 (4kB),以支持 1TB 及更大的磁盘。因此,在使用 dd 处理较新、较高容量的硬盘之前,我们需要检查磁盘块大小。
在本教程中,我们将使用在 VMware 中运行的 CentOS 安装程序,而不是在生产服务器上使用 *dd*。我们还将配置 VMware 以引导可启动的 Linux ISO 镜像,而不是使用可启动的 USB 闪存盘。
首先,我们需要下载名为 *CentOS Gnome ISO* 的 CentOS 镜像。该镜像大小接近 3GB,建议始终保留一份副本,用于创建可启动的 USB 闪存盘以及引导虚拟服务器安装程序以进行故障排除和裸机镜像。
其他可启动的 Linux 发行版也能正常工作。Linux Mint 可用于可启动的 ISO 镜像,因为它具有强大的硬件支持和完善的 GUI 磁盘维护工具。
CentOS GNOME Live 可启动镜像可从以下地址下载:http://buildlogs.centos.org/rolling/7/isos/x86_64/CentOS-7-x86_64-LiveGNOME.iso
让我们配置 VMware Workstation 安装程序以从我们的 Linux 可启动镜像引导。这些步骤适用于 OS X 上的 VMware。但是,它们在 Linux、Windows 上的 VMware Workstation 甚至 Virtual Box 上也类似。
注意 − 使用 Virtual Box 或 VMware Workstation 等虚拟桌面解决方案是设置实验室场景以学习 CentOS 管理任务的好方法。它提供了安装多个 CentOS 安装程序的能力,几乎无需硬件配置,从而使人们能够专注于管理,甚至可以在进行更改之前保存服务器状态。
首先,让我们配置一个虚拟 CD-ROM 并连接我们的 ISO 镜像以进行引导,而不是虚拟 CentOS 服务器安装程序 −
现在,设置启动磁盘 −
现在引导时,我们的虚拟机将从 CentOS 可启动 ISO 镜像引导,并允许访问先前配置的虚拟 CentOS 服务器上的文件。
让我们检查我们的磁盘,看看我们想从哪里复制 MBR(精简输出如下所示)。
MiNt ~ # fdisk -l Disk /dev/sda: 60 GiB, 21474836480 bytes, 41943040 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
我们已经找到我们的物理磁盘:*sda* 和 *sdb*。每个磁盘的块大小为 512 字节。因此,我们现在将运行 *dd* 命令来复制 SDA1 上 MBR 的前 512 字节。
最好的方法是 −
[root@mint rdc]# dd if=/dev/sda bs=512 count=1 | gzip -c > /mnt/sdb/images/mbr.iso.gz 1+0 records in 1+0 records out 512 bytes copied, 0.000171388 s, 3.0 MB/s [root@mint rdc]# ls /mnt/sdb/ mbr-iso.gz [root@mint rdc]#
就这样,我们得到了主引导记录的完整镜像。如果我们有足够的存储空间来镜像引导驱动器,我们可以轻松地制作完整的系统引导镜像 −
dd if=/dev/INPUT/DEVICE-NAME-HERE conv=sync,noerror bs=4K | gzip -c > /mnt/sdb/boot-server-centos-image.iso.gz
*conv=sync* 用于必须对物理介质进行字节对齐的情况。在这种情况下,如果未读取精确的 4K 对齐(例如…只有 3K 但需要在磁盘上占用至少一个 4K 块的文件。或者,读取时 simply 出现错误且 dd 无法读取文件。),则 dd 可能会出错。因此,带有 *conv=sync,noerror* 的 *dd* 将使用无关紧要但有用的数据将 3K 填充到 4K 块对齐的物理介质中。同时不会出现可能结束大型操作的错误。
处理来自磁盘的数据时,我们始终希望包含:*conv=sync,noerror* 参数。
这仅仅是因为磁盘不像 TCP 数据那样是流。它们是由对齐到特定大小的块组成的。例如,如果我们有 512 字节的块,则只有 300 字节的文件仍然需要 512 字节的磁盘空间(可能需要 2 个块用于 inode 信息,例如权限和其他文件系统信息)。
使用 gzip 和 tar 进行安全存储
gzip 和 tar 是 CentOS 管理员必须习惯使用的两个实用程序。它们的用途远不止于解压缩存档。
在 CentOS Linux 中使用 Gnu Tar
Tar 是一种存档实用程序,类似于 Windows 上的 *winrar*。其名称 *Tape Archive*(缩写为 *tar*)几乎概括了该实用程序的功能。*tar* 将获取文件并将它们放入存档中,以方便逻辑处理。因此,我们可以将存储在 /etc 中的数十个文件“tar”成一个存档,以便备份和存储。
*tar* 多年来一直是 Unix 和 Linux 上存储存档文件的标准。因此,将 *tar* 与 *gzip* 或 *bzip* 结合使用被认为是每个系统上存档的最佳实践。
以下是 *tar* 常用的常用命令行开关和选项列表 −
开关 | 操作 |
---|---|
-c | 创建一个新的 .tar 存档 |
-C | 解压到不同的目录 |
-j | 使用 bzip2 压缩 |
-z | 使用 gzip 压缩 |
-v | 详细显示存档进度 |
-t | 列出存档内容 |
-f | 存档的文件名 |
-x | 解压 tar 存档 |
以下是创建 *tar* 存档的基本语法。
tar -cvf [tar archive name]
关于 tar 的压缩机制的说明 − 建议在使用 tar 时坚持使用两种常见的压缩方案之一:gzip 和 bzip2。gzip 文件消耗的 CPU 资源较少,但通常大小较大。虽然 bzip2 的压缩时间较长,它们会使用更多的 CPU 资源;但最终文件大小会更小。
使用文件压缩时,我们始终希望使用标准文件扩展名,让包括我们在内的每个人都知道(而不是通过反复试验来猜测)需要什么压缩方案来解压存档。
bzip2 | .tbz |
bzip2 | .tar.tbz |
bzip2 | .tb2 |
gzip | .tar.gz |
gzip | .tgz |
如果需要可能在 Windows 机器上解压存档或在 Windows 上使用,建议使用 * .tar.tbz* 或 * .tar.gz*,因为大多数三个字符的单个扩展名会混淆 Windows 和仅限 Windows 的管理员(但是,这有时是预期的结果)
让我们从 Mac 工作站复制的远程备份创建一个 *gzipped* tar 存档 −
[rdc@mint Documents]$ tar -cvz -f RemoteStuff.tgz ./RemoteStuff/ ./RemoteStuff/ ./RemoteStuff/.DS_Store ./RemoteStuff/DDWRT/ ./RemoteStuff/DDWRT/.DS_Store ./RemoteStuff/DDWRT/ddwrt-linksys-wrt1200acv2-webflash.bin ./RemoteStuff/DDWRT/ddwrt_mod_notes.docx ./RemoteStuff/DDWRT/factory-to-ddwrt.bin ./RemoteStuff/open_ldap_config_notes/ ./RemoteStuff/open_ldap_config_notes/ldap_directory_a.png ./RemoteStuff/open_ldap_config_notes/open_ldap_notes.txt ./RemoteStuff/perl_scripts/ ./RemoteStuff/perl_scripts/mysnmp.pl ./RemoteStuff/php_scripts/ ./RemoteStuff/php_scripts/chunked.php ./RemoteStuff/php_scripts/gettingURL.php ./RemoteStuff/A Guide to the WordPress REST API | Toptal.pdf ./RemoteStuff/Rick Cardon Tech LLC.webloc ./RemoteStuff/VeeamDiagram.png ./RemoteStuff/backbox-4.5.1-i386.iso ./RemoteStuff/dhcp_admin_script_update.py ./RemoteStuff/test_file.txt [rdc@mint Documents]$ ls -ld RemoteStuff.tgz -rw-rw-r--. 1 rdc rdc 2317140451 Mar 12 06:10 RemoteStuff.tgz
注意 − 我们没有直接将所有文件添加到存档中,而是存档了整个文件夹 *RemoteStuff*。这是最简单的方法。因为解压后,整个目录 *RemoteStuff* 将与当前工作目录中的所有文件一起解压为 *./currentWorkingDirectory/RemoteStuff/*
现在让我们在 */root/* 主目录中解压存档。
[root@centos ~]# tar -zxvf RemoteStuff.tgz ./RemoteStuff/ ./RemoteStuff/.DS_Store ./RemoteStuff/DDWRT/ ./RemoteStuff/DDWRT/.DS_Store ./RemoteStuff/DDWRT/ddwrt-linksys-wrt1200acv2-webflash.bin ./RemoteStuff/DDWRT/ddwrt_mod_notes.docx ./RemoteStuff/DDWRT/factory-to-ddwrt.bin ./RemoteStuff/open_ldap_config_notes/ ./RemoteStuff/open_ldap_config_notes/ldap_directory_a.png ./RemoteStuff/open_ldap_config_notes/open_ldap_notes.txt ./RemoteStuff/perl_scripts/ ./RemoteStuff/perl_scripts/mysnmp.pl ./RemoteStuff/php_scripts/ ./RemoteStuff/php_scripts/chunked.php ./RemoteStuff/php_scripts/gettingURL.php ./RemoteStuff/A Guide to the WordPress REST API | Toptal.pdf ./RemoteStuff/Rick Cardon Tech LLC.webloc ./RemoteStuff/VeeamDiagram.png ./RemoteStuff/backbox-4.5.1-i386.iso ./RemoteStuff/dhcp_admin_script_update.py ./RemoteStuff/test_file.txt [root@mint ~]# ping www.google.com
如上所示,所有文件都只是解压到当前工作目录中的包含目录中。
[root@centos ~]# ls -l total 2262872 -rw-------. 1 root root 1752 Feb 1 19:52 anaconda-ks.cfg drwxr-xr-x. 137 root root 8192 Mar 9 04:42 etc_baks -rw-r--r--. 1 root root 1800 Feb 2 03:14 initial-setup-ks.cfg drwxr-xr-x. 6 rdc rdc 4096 Mar 10 22:20 RemoteStuff -rw-r--r--. 1 root root 2317140451 Mar 12 07:12 RemoteStuff.tgz -rw-r--r--. 1 root root 9446 Feb 25 05:09 ssl.conf [root@centos ~]#
使用 gzip 压缩文件备份
如前所述,我们可以使用命令行开关 * -j* 或 * -z* 从 tar 中使用 bzip2 或 gzip。我们还可以使用 gzip 压缩单个文件。但是,单独使用 bzip 或 gzip 并没有提供与与 *tar* 结合使用时一样多的功能。
使用 *gzip* 时,默认操作是删除原始文件,并用添加了 .gz 扩展名的压缩版本替换每个原始文件。
gzip 的一些常用命令行开关是 −
开关 | 操作 |
---|---|
-c | 放入存档后保留文件 |
-l | 获取压缩存档的统计信息 |
-r | 递归压缩目录中的文件 |
-1 到 9 | 指定 1 到 9 级别的压缩级别 |
*gzip* 或多或少基于逐个文件进行工作,而不是像某些 Windows 操作系统 zip 实用程序那样基于存档进行工作。其主要原因是 *tar* 已经提供了高级存档功能。*gzip* 的设计仅提供压缩机制。
因此,想到 *gzip* 时,请考虑单个文件。想到多个文件时,请考虑 *tar* 存档。现在让我们通过之前的 *tar* 存档来探索这一点。
注意 − 经验丰富的 Linux 专业人员通常将 tar 存档称为 tarball(tar 包)。
让我们从我们的 *rsync* 备份中创建另一个 *tar* 存档。
[root@centos Documents]# tar -cvf RemoteStuff.tar ./RemoteStuff/ [root@centos Documents]# ls RemoteStuff.tar RemoteStuff/
为了演示,让我们 *gzip* 新创建的 tarball,并告诉 *gzip* 保留旧文件。默认情况下,如果没有 * -c* 选项,gzip 将用 *.gz* 文件替换整个 tar 存档。
[root@centos Documents]# gzip -c RemoteStuff.tar > RemoteStuff.tar.gz [root@centos Documents]# ls RemoteStuff RemoteStuff.tar RemoteStuff.tar.gz We now have our original directory, our tarred directory and finally our gziped tarball.
让我们尝试使用 *gzip* 测试 * -l* 开关。
[root@centos Documents]# gzip -l RemoteStuff.tar.gz compressed uncompressed ratio uncompressed_name 2317140467 2326661120 0.4% RemoteStuff.tar [root@centos Documents]#
为了演示 *gzip* 与 Windows Zip 实用程序的不同之处,让我们在文本文件文件夹上运行 gzip。
[root@centos Documents]# ls text_files/ file1.txt file2.txt file3.txt file4.txt file5.txt [root@centos Documents]#
现在让我们使用 -r 选项递归压缩目录中的所有文本文件。
[root@centos Documents]# gzip -9 -r text_files/ [root@centos Documents]# ls ./text_files/ file1.txt.gz file2.txt.gz file3.txt.gz file4.txt.gz file5.txt.gz [root@centos Documents]#
看到?并非有些人预期的那样。所有原始文本文件都被删除,每个文件都被单独压缩。由于这种行为,最好只在需要处理单个文件时考虑使用 *gzip*。
使用 *tarball*,让我们将 *rsynced* tarball 解压到新目录。
[root@centos Documents]# tar -C /tmp -zxvf RemoteStuff.tar.gz ./RemoteStuff/ ./RemoteStuff/.DS_Store ./RemoteStuff/DDWRT/ ./RemoteStuff/DDWRT/.DS_Store ./RemoteStuff/DDWRT/ddwrt-linksys-wrt1200acv2-webflash.bin ./RemoteStuff/DDWRT/ddwrt_mod_notes.docx ./RemoteStuff/DDWRT/factory-to-ddwrt.bin ./RemoteStuff/open_ldap_config_notes/ ./RemoteStuff/open_ldap_config_notes/ldap_directory_a.png ./RemoteStuff/open_ldap_config_notes/open_ldap_notes.txt ./RemoteStuff/perl_scripts/ ./RemoteStuff/perl_scripts/mysnmp.pl ./RemoteStuff/php_scripts/ ./RemoteStuff/php_scripts/chunked.php
如上所示,我们将 tarball 解压到 /tmp 目录。
[root@centos Documents]# ls /tmp hsperfdata_root RemoteStuff
加密 Tarball 存档
加密 tarball 存档以存储可能需要其他组织员工访问的安全文档(例如灾难恢复)可能是一个棘手的概念。基本上有三种方法可以做到这一点:使用 GnuPG,或使用 openssl,或使用第三方实用程序。
GnuPG 主要设计用于非对称加密,并且考虑到身份关联,而不是密码短语。诚然,它可以与对称加密一起使用,但这并不是 GnuPG 的主要优势。因此,当需要多于原始人员访问的人员(例如,可能需要保护公司经理免受管理员利用所有“王国钥匙”作为杠杆的情况)时,我会不考虑使用 GnuPG 来存储具有物理安全性的存档。
像 GnuPG 一样,openssl 可以做我们想做的事情,并且随 CentOS 一起提供。但是,它并非专门设计用于实现我们想要的功能,并且加密在安全社区中受到质疑。
我们的选择是一个名为 **7zip** 的实用程序。7zip 是一种类似于 *gzip* 的压缩实用程序,但具有更多功能。与 Gnu Gzip 一样,7zip 及其标准也在开源社区中。我们只需要从我们的 EHEL 存储库安装 7zip(下一章将详细介绍安装扩展企业存储库)。
在 Centos 上安装 7zip
一旦我们的 EHEL 存储库在 CentOS 中加载并配置,7zip 的安装就非常简单。
[root@centos Documents]# yum -y install p7zip.x86_64 p7zip-plugins.x86_64 Loaded plugins: fastestmirror, langpacks base | 3.6 kB 00:00:00 epel/x86_64/metalink | 13 kB 00:00:00 epel | 4.3 kB 00:00:00 extras | 3.4 kB 00:00:00 updates | 3.4 kB 00:00:00 (1/2): epel/x86_64/updateinfo | 756 kB 00:00:04 (2/2): epel/x86_64/primary_db | 4.6 MB 00:00:18 Loading mirror speeds from cached hostfile --> Running transaction check ---> Package p7zip.x86_64 0:16.02-2.el7 will be installed ---> Package p7zip-plugins.x86_64 0:16.02-2.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved
就这么简单,7zip 已安装并可以使用 256 位 AES 加密来加密我们的 tarball 存档。
现在让我们使用 7z 使用密码加密我们的 gzip 存档。执行此操作的语法非常简单 −
7z a -p <output filename><input filename>
其中,**a:** 添加到存档,**-p:** 加密并提示输入密码
[root@centos Documents]# 7z a -p RemoteStuff.tgz.7z RemoteStuff.tar.gz 7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,1 CPU Intel(R) Core(TM) i5-4278U CPU @ 2.60GHz (40651),ASM,AES-NI) Scanning the drive: 1 file, 2317140467 bytes (2210 MiB) Creating archive: RemoteStuff.tgz.7z Items to compress: 1 Enter password (will not be echoed): Verify password (will not be echoed) : Files read from disk: 1 Archive size: 2280453410 bytes (2175 MiB) Everything is Ok [root@centos Documents]# ls RemoteStuff RemoteStuff.tar RemoteStuff.tar.gz RemoteStuff.tgz.7z slapD text_files [root@centos Documents]#
现在,我们有一个 .7z 压缩包,它使用 256 位 AES 加密 gzip 压缩的 tar 包。
注意 − 7zip 使用 256 位 AES 加密,并使用密码的 SHA-256 哈希值和计数器,重复最多 512K 次进行密钥派生。如果使用复杂的密钥,这应该足够安全。
对于较大的压缩包,加密和重新压缩归档文件的过程可能需要一些时间。
7zip 是一款高级工具,功能比 gzip 或 bzip2 更强大。但是,它在 CentOS 或 Linux 世界中并不像其他工具那样标准。因此,应尽可能多地使用其他实用程序。
Linux 管理员 - 系统更新
CentOS 7 系统可以通过三种方式更新:
- 手动
- 自动
- 手动更新主要安全问题并配置自动更新
在生产环境中,建议手动更新生产服务器。或者至少制定一个更新计划,以便管理员可以确保对业务运营至关重要的服务。
简单的安全更新可能会导致常用应用程序出现递归问题,这需要管理员进行升级和重新配置。因此,在生产环境中安排自动更新之前,请务必先在开发服务器和桌面进行测试。
手动更新 CentOS 7
要更新 CentOS 7,我们需要熟悉 `yum` 命令。`yum` 用于处理 CentOS 7 中的软件包存储库。`yum` 是通常用于执行以下操作的工具:
- 更新 CentOS 7 Linux 系统
- 搜索软件包
- 安装软件包
- 检测并安装软件包所需的依赖项
为了使用 `yum` 进行更新,您的 CentOS 服务器需要连接到互联网。大多数配置将安装基本系统,然后使用 `yum` 查询主要的 CentOS 存储库以获取软件包中的其他功能并应用系统更新。
我们已经使用 `yum` 安装了一些软件包。使用 `yum` 时,始终需要以 root 用户身份执行操作。或者具有 root 权限的用户。
[root@centos rdc]# yum search nano Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.rackspace.com * epel: mirror.chpc.utah.edu * extras: repos.forethought.net * updates: repos.forethought.net ====================================================================== N/S matched: nano ====================================================================== nano.x86_64 : A small text editor nodejs-nano.noarch : Minimalistic couchdb driver for Node.js perl-Time-Clock.noarch : Twenty-four hour clock object with nanosecond precision Name and summary matches only, use "search all" for everything. [root@centos rdc]#
现在,让我们安装 `nano` 文本编辑器。
[root@centos rdc]# yum install nano Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.keystealth.org * epel: pubmirror1.math.uh.edu * extras: centos.den.host-engine.com * updates: repos.forethought.net Resolving Dependencies --> Running transaction check ---> Package nano.x86_64 0:2.3.1-10.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: nano x86_64 2.3.1-10.el7 base 440 k Transaction Summary Install 1 Package Total download size: 440 k Installed size: 1.6 M Is this ok [y/d/N]: y Downloading packages: nano-2.3.1-10.el7.x86_64.rpm | 440 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : nano-2.3.1-10.el7.x86_64 1/1 Verifying : nano-2.3.1-10.el7.x86_64 1/1 Installed: nano.x86_64 0:2.3.1-10.el7 Complete! [root@centos rdc]#
我们已经安装了 nano 文本编辑器。我认为,这种方法比在网站上搜索实用程序并手动运行安装程序要容易得多。此外,存储库使用数字签名来验证软件包,确保它们来自受信任的来源。当信任新的存储库时,管理员有责任验证其真实性。这就是为什么建议谨慎对待第三方存储库的原因。
Yum 也可以用来删除软件包。
[root@centos rdc]# yum remove nano Loaded plugins: fastestmirror, langpacks Resolving Dependencies --> Running transaction check ---> Package nano.x86_64 0:2.3.1-10.el7 will be erased --> Finished Dependency Resolution Dependencies Resolved
现在让我们检查更新。
[root@centos rdc]# yum list updates Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.keystealth.org * epel: pubmirror1.math.uh.edu * extras: centos.den.host-engine.com * updates: repos.forethought.net Updated Packages NetworkManager.x86_64 1:1.4.0-17.el7_3 updates NetworkManager-adsl.x86_64 1:1.4.0-17.el7_3 updates NetworkManager-glib.x86_64 1:1.4.0-17.el7_3 updates NetworkManager-libnm.x86_64 1:1.4.0-17.el7_3 updates NetworkManager-team.x86_64 1:1.4.0-17.el7_3 updates NetworkManager-tui.x86_64 1:1.4.0-17.el7_3 updates NetworkManager-wifi.x86_64 1:1.4.0-17.el7_3 updates audit.x86_64 2.6.5-3.el7_3.1 updates audit-libs.x86_64 2.6.5-3.el7_3.1 updates audit-libs-python.x86_64
如所示,我们有几十个更新等待安装。实际上,由于我们尚未配置自动更新,因此大约有 100 个更新。因此,让我们安装所有挂起的更新。
[root@centos rdc]# yum update Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.usc.edu * epel: pubmirror1.math.uh.edu * extras: repos.forethought.net * updates: repos.forethought.net Resolving Dependencies --> Running transaction check ---> Package NetworkManager.x86_64 1:1.4.0-14.el7_3 will be updated ---> Package NetworkManager.x86_64 1:1.4.0-17.el7_3 will be an update selinux-policy noarch 3.13.1102.el7_3.15 updates 414 k selinux-policy-targeted noarch 3.13.1102.el7_3.15 updates 6.4 M systemd x86_64 21930.el7_3.7 updates 5.2 M systemd-libs x86_64 21930.el7_3.7 updates 369 k systemd-python x86_64 21930.el7_3.7 updates 109 k systemd-sysv x86_64 21930.el7_3.7 updates 63 k tcsh x86_64 6.18.01-13.el7_3.1 updates 338 k tzdata noarch 2017a1.el7 updates 443 k tzdata-java noarch 2017a1.el7 updates 182 k wpa_supplicant x86_64 1:2.021.el7_3 updates 788 k Transaction Summary =============================================================================== Install 2 Packages Upgrade 68 Packages Total size: 196 M Total download size: 83 M Is this ok [y/d/N]:
按下“y”键后,CentOS 7 的更新将开始。`yum` 更新时通常会经历以下过程:
- 检查当前软件包
- 在存储库中查找更新的软件包
- 计算更新的软件包所需的依赖项
- 下载更新
- 安装更新
现在,让我们确保我们的系统是最新的:
[root@centos rdc]# yum list updates Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * updates: mirror.compevo.com [root@centos rdc]#
如您所见,没有列出任何更新。
配置 YUM 的自动更新
如前所述,在企业环境中,自动更新可能不是首选的安装方法。让我们来看一下使用 yum 配置自动更新的步骤。
首先,我们安装一个名为 `yum-cron` 的软件包。
[root@centos rdc]# yum -y install yum-cron Install 1 Package Total download size: 61 k Installed size: 51 k Downloading packages: yum-cron-3.4.3-150.el7.centos.noarch.rpm | 61 kB 00:00:01 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : yum-cron-3.4.3-150.el7.centos.noarch 1/1 Verifying : yum-cron-3.4.3-150.el7.centos.noarch 1/1 Installed: yum-cron.noarch 0:3.4.3-150.el7.centos Complete! [root@centos rdc]#
默认情况下,`yum-cron` 只下载更新,而不安装它们。是否自动安装更新取决于管理员。最大的问题是:有些更新需要重新启动系统。此外,有些更新可能需要在服务再次运行之前进行配置更改。
更新依赖项可能会在以下情况下导致递归问题:
yum 建议更新某个库
该库只支持 Apache 服务器 2.4,但我们有 2.3 服务器
我们的电子商务网站依赖于特定版本的 PHP
为该库安装的新版 Apache 需要升级 PHP
我们的生产 Web 应用程序尚未在新版 PHP 版本上进行测试
除非配置为不这样做,否则 yum 可能会在未经通知的情况下自动升级 Apache 和 PHP。
如果所有 5 种情况都发生,可能会导致从早上的一场大麻烦到可能危及用户数据的安全漏洞。虽然上述示例是一种完美的风暴,但我们永远不想发生这种情况。
管理员需要评估由于更新重新引导和重新配置导致的可能服务停机时间而造成的潜在收入损失的情况。对于每天数百万美元的电子商务网站来说,这种做法可能不够保守。
现在让我们配置 `yum-cron` 以自动安装系统更新。
[root@centos rdc]# vim /etc/yum/yum-cron.conf # Whether updates should be applied when they are available. Note # that download_updates must also be yes for the update to be applied. apply_updates = yes
我们要将 `apply_updates = no` 更改为 `apply_updates = yes`。现在让我们配置 `yum-cron` 的更新间隔。
同样,是否使用自动更新并根据需要安装更新可能是一把双刃剑,管理员需要针对每种独特情况进行考虑。
Linux 管理员 - Shell 脚本
Bash Shell 简介
与 GNU Linux 的各种发行版一样,shell 也有多种类型,并且兼容性各不相同。CentOS 中的默认 shell 称为 Bash 或 Bourne Again Shell。Bash shell 是 Stephen Bourne 开发的现代修改版 Bourne Shell。Bash 直接取代了 Ken Thompson 和 Dennis Ritchie 在贝尔实验室开发的 Unix 操作系统上的原始 Thompson Shell(Stephen Bourne 也是贝尔实验室的雇员)。
每个人都有自己喜欢的 shell,每个 shell 都有其优点和缺点。但在大多数情况下,Bash 将成为所有 Linux 发行版中的默认 shell,并且是最常用的。随着经验的积累,每个人都希望探索和使用最适合自己的 shell。但与此同时,每个人也都希望掌握 Bash shell。
其他 Linux shell 包括:Tcsh、Csh、Ksh、Zsh 和 Fish。
掌握任何 Linux shell 的专业技能对于 CentOS 管理员来说极其重要。正如我们前面提到的,与 Windows 不同,Linux 本质上是一个命令行操作系统。shell 只是一种用户界面,允许管理员(或用户)向操作系统发出命令。如果 Linux 系统管理员是一位航空公司飞行员,那么使用 shell 就类似于将飞机从自动驾驶仪上移开并抓住手动控制装置以进行更灵活的飞行。
Linux shell(如 Bash)在计算机科学术语中被称为命令行解释器。Microsoft Windows 也有两个命令行解释器,称为 DOS(不要与原始 DOS 操作系统混淆)和 PowerShell。
大多数现代 shell(如 Bash)都提供结构,允许更复杂的shell 脚本来自动执行常见和复杂的任务。
结构包括:
- 脚本流程控制(ifthen 和 else)
- 逻辑比较运算(大于、小于、等于)
- 循环
- 变量
- 定义操作的参数(类似于命令的开关)
使用 Shell 脚本与脚本语言
在考虑执行任务时,管理员经常会问自己:我应该使用 shell 脚本还是使用 Perl、Ruby 或 Python 等脚本语言?
这里没有固定的规则。shell 与脚本语言之间只有典型的区别。
Shell
Shell 允许使用 Linux 命令,例如 `sed`、`grep`、`tee`、`cat` 和 Linux 操作系统上的所有其他基于命令行的实用程序。事实上,几乎任何基于命令行的 Linux 实用程序都可以在您的 shell 中编写脚本。
使用 shell 的一个很好的例子是快速脚本,用于检查主机列表的 DNS 解析。
我们简单的 Bash 脚本用于检查 DNS 名称:
#!/bin/bash for name in $(cat $1); do host $name.$2 | grep "has address" done exit
用于测试 DNS 解析的小型词表:
dns www test dev mail rdp remote
针对 google.com 域的输出:
[rdc@centos ~]$ ./dns-check.sh dns-names.txt google.com -doing dns dns.google.com has address 172.217.6.46 -doing www www.google.com has address 172.217.6.36 -doing test -doing dev -doing mail googlemail.l.google.com has address 172.217.6.37 -doing rdp -doing remote [rdc@centos ~]$
利用 shell 中简单的 Linux 命令,我们能够创建一个简单的 5 行脚本,用于审核来自词表的 DNS 名称。即使使用良好实现的 DNS 库,这在 Perl、Python 或 Ruby 中也需要相当长的时间。
脚本语言
脚本语言将提供 shell 之外的更多控制。上述 Bash 脚本使用了 Linux `host` 命令的包装器。如果我们想做更多的事情并创建我们自己的类似于 `host` 的应用程序来与 shell 之外进行交互呢?这就是我们将使用脚本语言的地方。
此外,使用维护良好的脚本语言,我们知道我们的操作在大多数情况下可以在不同的系统上运行。例如,Python 3.5 将在运行 Python 3.5 并安装相同库的任何其他系统上运行。但是,如果我们想在 Linux 和 HP-UX 上运行我们的 BASH 脚本,情况就不是这样了。
有时,脚本语言和强大的 shell 之间的界限可能会模糊。可以使用 Python、Perl 或 Ruby 自动执行 CentOS Linux 管理任务。这样做实际上非常普遍。此外,熟练的 shell 脚本开发人员已经在 Bash 中创建了一个简单但功能完善的 Web 服务器守护程序。
在掌握了脚本语言和在 shell 中自动执行任务的经验后,CentOS 管理员将能够快速确定在需要解决问题时从哪里开始。通常情况下,项目是从 shell 脚本开始的。然后随着项目的复杂性增加,再转向脚本(或编译)语言。
此外,可以使用脚本语言和 shell 脚本完成项目的不同部分。一个例子可能是使用 Perl 脚本抓取网站。然后,使用 shell 脚本使用 `sed`、`awk` 和 `egrep` 进行解析和格式化。最后,使用 PHP 脚本通过 Web GUI 将格式化后的数据插入 MySQL 数据库。
在了解了 shell 的一些理论之后,让我们开始学习从 CentOS 的 Bash shell 自动执行任务的基本构建块。
输入输出和重定向
将标准输出处理到另一个命令:
[rdc@centos ~]$ cat ~/output.txt | wc -l 6039 [rdc@centos ~]$
上面,我们将 `cat` 的标准输出传递给 `wc` 进行处理,使用管道字符。`wc` 然后处理 `cat` 的输出,将 output.txt 的行数打印到终端。将管道字符视为将一个命令的输出传递给下一个命令的“管道”。
以下是处理命令重定向时需要记住的关键概念:
编号 | 文件描述符 | 字符 |
---|---|---|
0 | 标准输入 | < |
1 | 标准输出 | > |
2 | 标准错误 | |
追加标准输出 | >> | |
分配重定向 | & | |
将标准输出通过管道传输到标准输入 | | |
我们在第一章中介绍了这个概念,但并没有过多讨论重定向或重定向的分配。在 Linux 中打开终端时,你的 shell 被视为默认目标 -
- 标准输入 < 0
- 标准输出 > 1
- 标准错误 2
让我们看看它是如何工作的 -
[rdc@centos ~]$ lsof -ap $BASHPID -d 0,1,2 COMMAND PID USER **FD** TYPE DEVICE SIZE/OFF NODE NAME bash 13684 rdc **0u** CHR 136,0 0t0 3 /dev/pts/0 bash 13684 rdc **1u** CHR 136,0 0t0 3 /dev/pts/0 bash 13684 rdc **2u** CHR 136,0 0t0 3 /dev/pts/0 [rdc@centos ~]$
/dev/pts/0 是我们的伪终端。CentOS Linux 会查看它,并将我们打开的终端应用程序视为一个真正的终端,其键盘和显示器通过串行接口连接。但是,就像 hypervisor 将硬件抽象到操作系统一样,/dev/pts 将我们的终端抽象到应用程序。
从上面的 lsof 命令中,我们可以看到在 **FD** 列中,所有三个文件描述符都设置为我们的虚拟终端 (0,1,2)。现在我们可以发送命令、查看命令输出以及与命令相关的任何错误。
以下是 STDIN 和 STDOUT 的示例 -
STDOUT
[root@centosLocal centos]# echo "I am coming from Standard output or STDOUT." > output.txt && cat output.txt I am coming from Standard output or STDOUT. [root@centosLocal centos]#
也可以将 stdout 和 stderr 发送到不同的文件 -
bash-3.2# find / -name passwd 1> good.txt 2> err.txt bash-3.2# cat good.txt /etc/pam.d/passwd /etc/passwd bash-3.2# cat err.txt find: /dev/fd/3: Not a directory find: /dev/fd/4: Not a directory bash-3.2#
在搜索整个文件系统时,遇到两个错误。每个错误都被发送到单独的文件以供以后查看,而返回的结果则被放置到一个单独的文本文件中。
在执行向终端输出大量数据的操作(例如编译应用程序)时,将 stderr 发送到文本文件非常有用。这允许查看可能因终端滚动历史记录而丢失的错误。
将 STDOUT 传递到文本文件时需要注意一点,那就是 **>>** 和 **>** 之间的区别。双“>>”将追加到文件,而单数形式将覆盖文件并写入新内容(因此所有先前的数据都将丢失)。
STDIN
[root@centosLocal centos]# cat < stdin.txt Hello, I am being read form Standard input, STDIN. [root@centosLocal centos]#
在上面的命令中,文本文件 stdin.txt 被重定向到 cat 命令,该命令将其内容回显到 STDOUT。
管道字符 "|"
管道字符将获取第一个命令的输出,将其作为输入传递到下一个命令,允许第二个命令对输出执行操作。
现在,让我们将 cat 的 stdout “管道”到另一个命令 -
[root@centosLocal centos]# cat output.txt | wc -l 2 [root@centosLocal centos]#
上面,wc 对从管道传递的 cat 的输出执行计算。管道命令在过滤 grep 或 egrep 的输出时特别有用 -
[root@centosLocal centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l 9000 [root@centosLocal centos]#
在上面的命令中,我们将每个 4 位数字从包含 65535 到所有数字的文本文件(通过 egrep 过滤器传递)传递到 wc。
使用 & 重定向输出
可以使用 **&** 字符重定向输出。如果我们想将 STDOUT 和 STDERR 的输出都重定向到同一个文件,则可以按如下方式完成 -
[root@centosLocal centos]# find / -name passwd > out.txt 2>&1 [root@centosLocal centos]# cat out.txt find: /dev/fd/3: Not a directory find: /dev/fd/4: Not a directory /etc/passwd [root@centosLocal centos]#
使用 **&** 字符进行重定向的工作原理如下:首先,输出被重定向到 out.txt。其次,STDERR 或文件描述符 2 被重新分配到与 STDOUT 相同的位置,在本例中为 out.txt。
重定向非常有用,在解决处理大型文本文件、编译源代码、重定向 shell 脚本中的输出以及发出复杂的 Linux 命令时遇到的问题时非常方便。
虽然功能强大,但对于较新的 CentOS 管理员来说,重定向可能会变得很复杂。练习、研究和偶尔向 Linux 论坛(例如 Stack Overflow Linux)提问将有助于解决高级问题。
Bash Shell 结构
现在我们已经很好地了解了 Bash shell 的工作原理,让我们学习一些常用的基本结构来编写脚本。在本节中,我们将探讨 -
BASH 故障排除提示
与专用脚本语言相比,BASH 可能有点棘手。BASH 脚本中最大的障碍之一是错误转义或未转义传递到 shell 的脚本操作。如果你已经检查过脚本几次,但它没有按预期工作,请不要担心。即使对于那些每天使用 BASH 创建复杂脚本的人来说,这也是很常见的。
快速搜索 Google 或注册专家 Linux 论坛提问将很快得到解决。很有可能有人遇到过完全相同的问题,并且它已经被解决了。
BASH 脚本是一种快速创建强大脚本的绝佳方法,这些脚本可用于从自动化管理任务到创建有用工具的一切用途。成为一名专家级的 BASH 脚本开发者需要时间和实践。因此,尽可能使用 BASH 脚本,它是 CentOS 管理工具箱中的一款强大工具。
Linux 管理员 - 包管理
CentOS 中的包管理可以通过两种方式执行:从终端和从图形用户界面。
CentOS 管理员的大部分时间往往都用于使用终端。更新和安装 CentOS 包也不例外。考虑到这一点,我们将首先探讨终端中的包管理,然后触及使用 CentOS 提供的图形包管理工具。
YUM 包管理器
YUM 是 CentOS 中提供的包管理工具。我们在前几章中简要介绍了这个主题。在本章中,我们将从干净的 CentOS 安装开始。我们将首先完全更新我们的安装,然后安装一个应用程序。
YUM 极大地促进了 Linux 中的软件安装和管理。YUM 会“自动”检查过时的依赖项以及过时的包。与从源代码编译每个应用程序的旧时代相比,这确实减轻了 CentOS 管理员的负担。
yum check-update
检查可以更新的包。在本教程中,我们将假设这是一个将面向互联网的生产系统,没有任何需要在升级包之前由 DevOps 测试的生产应用程序。现在让我们将更新的候选包安装到系统中。
[root@localhost rdc]# yum check-update Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.scalabledns.com * extras: mirror.scalabledns.com * updates: mirror.clarkson.edu NetworkManager.x86_64 1:1.4.0-19.el7_3 updates NetworkManager-adsl.x86_64 1:1.4.0-19.el7_3 updates NetworkManager-glib.x86_64 1:1.4.0-19.el7_3 updates NetworkManager-libnm.x86_64 1:1.4.0-19.el7_3 updates NetworkManager-team.x86_64 1:1.4.0-19.el7_3 updates NetworkManager-tui.x86_64 1:1.4.0-19.el7_3 updates NetworkManager-wifi.x86_64 1:1.4.0-19.el7_3 updates audit.x86_64 2.6.5-3.el7_3.1 updates vim-common.x86_64 2:7.4.160-1.el7_3.1 updates vim-enhanced.x86_64 2:7.4.160-1.el7_3.1 updates vim-filesystem.x86_64 2:7.4.160-1.el7_3.1 updates vim-minimal.x86_64 2:7.4.160-1.el7_3.1 updates wpa_supplicant.x86_64 1:2.0-21.el7_3 updates xfsprogs.x86_64 4.5.0-9.el7_3 updates [root@localhost rdc]#
yum update
这将安装所有更新的候选包,使您的 CentOS 安装保持最新。对于新安装,这可能需要一些时间,具体取决于您的安装和互联网连接速度。
[root@localhost rdc]# yum update vim-minimal x86_64 2:7.4.160-1.el7_3.1 updates 436 k wpa_supplicant x86_64 1:2.0-21.el7_3 updates 788 k xfsprogs x86_64 4.5.0-9.el7_3 updates 895 k Transaction Summary ====================================================================================== Install 2 Packages Upgrade 156 Packages Total download size: 371 M Is this ok [y/d/N]:
通过 YUM 安装软件
除了更新 CentOS 系统外,YUM 包管理器是我们安装软件的首选工具。从网络监控工具、视频播放器到文本编辑器,都可以通过 YUM 从中央存储库安装。
在安装一些软件实用程序之前,让我们看看一些 YUM 命令。对于日常工作,CentOS 管理员 90% 的 YUM 使用量大约是 7 个命令。我们将介绍每一个命令,希望能够熟悉在日常使用中熟练操作 YUM。但是,像大多数 Linux 实用程序一样,YUM 提供了丰富的先进功能,始终可以通过手册页进行探索。使用 man yum 将始终是使用任何 Linux 实用程序执行不熟悉操作的第一步。
最常用的 YUM 命令
以下是常用的 YUM 命令。
命令 | 操作 |
---|---|
list installed | 列出通过 YUM 安装的包 |
list all | 列出所有当前可用的包 |
group list | 列出分组的包 |
info | 提供有关包的详细信息 |
search | 搜索包描述和名称 |
install | 安装包 |
localinstall | 安装本地 rpm 包 |
remove | 删除和安装包 |
clean all | 清除 /var/cache/yum 以释放磁盘空间 |
man yum | 像所有 linux 命令一样,帮助文件 |
使用 YUM 安装软件
我们现在将安装一个名为 Lynx 的基于文本的 Web 浏览器。在安装之前,我们必须首先获取包含 Lynx Web 浏览器的包名称。我们甚至不能 100% 确定我们的默认 CentOS 存储库是否提供 Lynx Web 浏览器的包,所以让我们搜索一下 -
[root@localhost rdc]# yum search web browser Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.scalabledns.com * extras: mirror.scalabledns.com * updates: mirror.clarkson.edu ================================================================= N/S matched: web, browser ================================================================== icedtea-web.x86_64 : Additional Java components for OpenJDK - Java browser plug-in and Web Start implementation elinks.x86_64 : A text-mode Web browser firefox.i686 : Mozilla Firefox Web browser firefox.x86_64 : Mozilla Firefox Web browser lynx.x86_64 : A text-based Web browser Full name and summary matches only, use "search all" for everything. [root@localhost rdc]#
我们看到,CentOS 确实在存储库中提供了 Lynx Web 浏览器。让我们看看有关该包的更多信息。
[root@localhost rdc]# lynx.x86_64 bash: lynx.x86_64: command not found... [root@localhost rdc]# yum info lynx.x86_64 Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.scalabledns.com * extras: mirror.scalabledns.com * updates: mirror.clarkson.edu Available Packages Name : lynx Arch : x86_64 Version : 2.8.8 Release : 0.3.dev15.el7 Size : 1.4 M Repo : base/7/x86_64 Summary : A text-based Web browser URL : http://lynx.isc.org/ License : GPLv2 Description : Lynx is a text-based Web browser. Lynx does not display any images, : but it does support frames, tables, and most other HTML tags. One : advantage Lynx has over graphical browsers is speed; Lynx starts and : exits quickly and swiftly displays web pages. [root@localhost rdc]#
很好!2.8 版本足够新,所以让我们安装 Lynx。
[root@localhost rdc]# yum install lynx Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.scalabledns.com * extras: mirror.scalabledns.com * updates: mirror.clarkson.edu Resolving Dependencies --> Running transaction check ---> Package lynx.x86_64 0:2.8.8-0.3.dev15.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved =============================================================================== =============================================================================== Package Arch Version Repository Size =============================================================================== =============================================================================== Installing: lynx x86_64 2.8.80.3.dev15.el7 base 1.4 M Transaction Summary =============================================================================== =============================================================================== Install 1 Package Total download size: 1.4 M Installed size: 5.4 M Is this ok [y/d/N]: y Downloading packages: No Presto metadata available for base lynx-2.8.8-0.3.dev15.el7.x86_64.rpm | 1.4 MB 00:00:10 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : lynx-2.8.8-0.3.dev15.el7.x86_64 1/1 Verifying : lynx-2.8.8-0.3.dev15.el7.x86_64 1/1 Installed: lynx.x86_64 0:2.8.8-0.3.dev15.el7 Complete! [root@localhost rdc]#
接下来,让我们确保 Lynx 确实正确安装了。
[root@localhost rdc]# yum list installed | grep -i lynx lynx.x86_64 2.8.8-0.3.dev15.el7 @base [root@localhost rdc]#
太棒了!让我们使用 Lynx 并看看没有“点赞”和漂亮图片的网络是什么样的。
[root@localhost rdc]# lynx www.tutorialpoint.in
太好了,现在我们有一个用于生产服务器的 Web 浏览器,可以在无需过多担心通过网络启动的远程攻击的情况下使用。这对生产服务器来说是一件好事。
我们快完成了,但是首先我们需要为开发人员设置此服务器以测试应用程序。因此,让我们确保他们拥有完成工作所需的所有工具。我们可以单独安装所有内容,但 CentOS 和 YUM 使此过程快得多。让我们安装 开发人员组包。
[root@localhost rdc]# yum groups list Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.scalabledns.com * extras: mirror.scalabledns.com * updates: mirror.clarkson.edu Available Groups: Compatibility Libraries Console Internet Tools Development Tools Graphical Administration Tools Legacy UNIX Compatibility Scientific Support Security Tools Smart Card Support System Administration Tools System Management Done [root@localhost rdc]#
这是 CentOS 提供的较小的包组列表。让我们看看“开发组”中包含什么。
[root@localhost rdc]# yum group info "Development Tools" Loaded plugins: fastestmirror, langpacks There is no installed groups file. Maybe run: yum groups mark convert (see man yum) Loading mirror speeds from cached hostfile * base: mirror.scalabledns.com * extras: mirror.scalabledns.com * updates: mirror.clarkson.edu Group: Development Tools Group-Id: development Description: A basic development environment. Mandatory Packages: autoconf automake binutils bison
输出的第一屏如上所示。整个列表相当全面。但是,随着时间的推移,通常需要完整安装此组。让我们安装整个开发组。
[root@localhost rdc]# yum groupinstall "Development Tools"
这将是一个较大的安装。完成后,您的服务器将拥有大多数 Perl、Python、C 和 C++ 的开发库和编译器。
CentOS 中的图形化包管理
Gnome 桌面提供了一个名为 Software 的图形化包管理工具。它非常易于使用且简单明了。CentOS 的 Gnome 包管理工具 Software 可以通过导航到:应用程序 → 系统工具 → Software 来找到。
软件包管理工具分为几组,允许管理员选择要安装的包。虽然此工具非常易于使用,并且对于最终用户来说非常简单,但 YUM 功能更强大,管理员可能会更多地使用它。
以下是软件包管理工具的屏幕截图,并非真正为系统管理员设计。
Linux 管理员 - 卷管理
逻辑卷管理 (LVM) 是 Linux 用于跨不同物理硬盘管理存储卷的一种方法。这与 RAID 不同,但其概念类似于 RAID 0 或 J-Bod。使用 LVM,可以(例如)拥有三个各为 1TB 的物理磁盘,然后创建一个大约 3TB 的逻辑卷,例如 /dev/sdb。甚至可以创建两个 1.5TB 的逻辑卷,五个 500GB 的逻辑卷,或者任何组合。单个磁盘甚至可以用于逻辑卷的快照。
注意 − 正确配置后,使用逻辑卷实际上会提高磁盘 I/O 性能。这与 RAID 0 将数据跨多个磁盘条带化的方式类似。
学习使用 LVM 进行卷管理时,如果我们知道 LVM 中每个组件是什么,就会更容易。请学习下表以全面掌握每个组件。如有需要,请使用 Google 搜索学习。了解逻辑卷的每个部分对于管理它们非常重要。
PV | 物理卷 | sda |
PP | 物理分区 | sda1 , sda2 |
VG | 卷组 | 合并的物理资源 |
LV | 逻辑卷 | 对操作系统来说是一个存储设备 |
物理卷 将显示为 /dev/sda、/dev/sdb;Linux 检测到的物理磁盘。
物理分区 将是磁盘实用程序(如 fdisk)分区的一段磁盘。请记住,在大多数常见的 LVM 设置中不推荐使用物理分区。示例:磁盘 /dev/sda 分区为包含两个物理分区:/dev/sda1 和 /dev/sda1
如果我们有两个各为 1TB 的物理磁盘,我们可以在这两个磁盘之间创建一个近 2TB 的卷组。
从卷组中,我们可以创建三个逻辑卷,每个逻辑卷的大小不超过卷组的总大小。
传统的 Linux 磁盘管理工具
在了解 CentOS 7 中用于 LVM 管理的最新最佳功能工具之前,我们应该首先探索用于 Linux 磁盘管理的更传统工具。这些工具将会派上用场,并且仍然可以与当今的先进 LVM 工具(如系统存储管理器 - lsblk、parted 和 mkfs.xfs)一起使用。
现在,假设我们向系统添加了另一个或两个磁盘,我们需要枚举 Linux 检测到的磁盘。我始终建议在执行被认为是破坏性操作之前每次都枚举磁盘。lsblk 是获取磁盘信息的绝佳工具。让我们看看 CentOS 检测到哪些磁盘。
[root@localhost rdc]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─cl-root 253:0 0 17G 0 lvm / └─cl-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 6G 0 disk sdc 8:32 0 4G 0 disk sr0 11:0 1 1024M 0 rom
如您所见,此系统上有三个磁盘:sda、sdb 和 sdc。
磁盘 sda 包含我们正在使用的 CentOS 安装,因此我们不想随意操作 sda。sdb 和 sdc 都是为此教程添加到系统的。让我们使这些磁盘对 CentOS 可用。
创建磁盘标签
[root@localhost rdc]# parted /dev/sdb mklabel GPT Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue? Yes/No? Yes [root@localhost rdc]#
我们现在已经标记了一个磁盘。只需以相同的方式在 sdc 上运行 parted 命令。
创建磁盘分区
我们每个磁盘只创建一个分区。要创建分区,再次使用 parted 命令。
[root@localhost rdc]# parted -a opt /dev/sdb mkpart primary ext4 0% 100%
警告 − 您请求从 0.00B 到 6442MB(扇区 0..12582911)的分区。
我们可以管理的最接近的位置是 17.4kB 到 1048kB(扇区 34..2047)。
您仍然接受吗?
是/否?否
[root@localhost rdc]# parted -a opt /dev/sdc mkpart primary ext4 0% 100%
信息 − 您可能需要更新 /etc/fstab。
[root@localhost rdc]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part / boot └─sda2 8:2 0 19G 0 part ├─cl-root 253:0 0 17G 0 lvm / └─cl-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 6G 0 disk └─sdb1 8:17 0 6G 0 part sdc 8:32 0 4G 0 disk └─sdc1 8:33 0 4G 0 part sr0 11:0 1 1024M 0 rom [root@localhost rdc]#
从 lsblk 输出可以看出,我们现在有两个分区,每个分区都在 sdb 和 sdc 上。
创建文件系统
最后,在挂载和使用任何卷之前,我们需要添加一个文件系统。我们将使用 XFS 文件系统。
root@localhost rdc]# mkfs.xfs -f /dev/sdb1 meta-data = /dev/sdb1 isize = 512 agcount = 4, agsize = 393088 blks = sectsz = 512 attr = 2, projid32bit = 1 = crc = 1 finobt = 0, sparse = 0 data = bsize = 4096 blocks = 1572352, imaxpct = 25 = sunit = 0 swidth = 0 blks naming = version 2 bsize = 4096 ascii-ci = 0 ftype = 1 log = internal log bsize = 4096 blocks = 2560, version = 2 = sectsz = 512 sunit = 0 blks, lazy-count = 1 realtime = none extsz = 4096 blocks = 0, rtextents = 0 [root@localhost rdc]# mkfs.xfs -f /dev/sdc1 meta-data = /dev/sdc1 isize = 512 agcount = 4, agsize = 262016 blks = sectsz = 512 attr = 2, projid32bit = 1 = crc = 1 finobt = 0, sparse = 0 data = bsize = 4096 blocks = 1048064, imaxpct = 25 = sunit = 0 swidth = 0 blks naming = version 2 bsize = 4096 ascii-ci = 0 ftype = 1 log = internal log bsize = 4096 blocks = 2560, version = 2 = sectsz = 512 sunit = 0 blks, lazy-count = 1 realtime = none extsz = 4096 blocks = 0, rtextents = 0 [root@localhost rdc]#
让我们检查一下每个文件系统是否可用。
[root@localhost rdc]# lsblk -o NAME,FSTYPE NAME FSTYPE sda ├─sda1 xfs └─sda2 LVM2_member ├─cl-root xfs └─cl-swap swap sdb └─sdb1 xfs sdc └─sdc1 xfs sr0 [root@localhost rdc]#
每个现在都使用 XFS 文件系统。让我们挂载它们,检查挂载点,并将文件复制到每个挂载点。
[root@localhost rdc]# mount -o defaults /dev/sdb1 /mnt/sdb [root@localhost rdc]# mount -o defaults /dev/sdc1 /mnt/sdc [root@localhost ~]# touch /mnt/sdb/myFile /mnt/sdc/myFile [root@localhost ~]# ls /mnt/sdb /mnt/sdc /mnt/sdb: myFile /mnt/sdc: myFile
此时我们有两个可用的磁盘。但是,只有手动挂载它们后才能使用它们。要启动时挂载每个磁盘,我们必须编辑 fstab 文件。此外,必须为需要访问新磁盘的组设置权限。
创建卷组和逻辑卷
CentOS 7 最大的改进之一是包含了一个名为系统存储管理器或ssm 的实用程序。系统存储管理器极大地简化了在 Linux 上管理 LVM 池和存储卷的过程。
我们将介绍在 CentOS 中创建简单的卷池和逻辑卷的过程。第一步是安装系统存储管理器。
[root@localhost rdc]# yum install system-storage-manager
让我们使用 ssm list 命令查看我们的磁盘。
如上所示,系统上总共安装了三个磁盘。
/sdba1 − 托管我们的 CentOS 安装
/sdb1 − 挂载在 /mnt/sdb
/sdc1 − 挂载在 /mnt/sdc
我们要做的是使用两个磁盘(sdb 和 sdc)创建一个卷组。然后使系统可以使用三个 3GB 的逻辑卷。
让我们创建卷组。
[root@localhost rdc]# ssm create -p NEW_POOL /dev/sdb1 /dev/sdc1
默认情况下,ssm 将创建一个扩展整个 10GB 池的单个逻辑卷。我们不想要这个,所以让我们删除它。
[root@localhost rdc]# ssm remove /dev/NEW_POOL/lvol001 Do you really want to remove active logical volume NEW_POOL/lvol001? [y/n]: y Logical volume "lvol001" successfully removed [root@localhost rdc]#
最后,让我们创建三个逻辑卷。
[root@localhost rdc]# ssm create -n disk001 --fs xfs -s 3GB -p NEW_POOL [root@localhost rdc]# ssm create -n disk002 --fs xfs -s 3GB -p NEW_POOL [root@localhost rdc]# ssm create -n disk003 --fs xfs -s 3GB -p NEW_POOL
现在,让我们检查我们的新卷。
我们现在拥有三个跨越两个物理磁盘分区的独立逻辑卷。
逻辑卷是现在内置于 CentOS Linux 的一项强大功能。我们已经接触了管理这些逻辑卷的表面内容。掌握池和逻辑卷需要实践和从 Tutorials Point 等资源中进行扩展学习。目前,您已经学习了 CentOS 中 LVM 管理的基础知识,并且能够在单个主机上创建基本的条带化逻辑卷。