目录
该章节介绍如何配置系统服务、后台 daemon 以及远程访问 Kylin Linux Advanced Server V10 系统。
5.1.1. Systemd 介绍
systemd 是 Linux 下一个与 SysV 和 LSB 初始化脚本兼容的系统和服务管理器。systemd 使用 socket 和 D-Bus 来开启服务,提供基于守护进程的按需启动策略,保留了 Linux cgroups 的进程追踪功能,支持快照和系统状态恢复,维护挂载和自挂载点,实现了各服务间基于从属关系的一个更为精细的逻辑控制,拥有前卫的并行性能。systemd 无需经过任何修改便可以替代 sysvinit。
systemd 开启和监督整个系统是基于 unit 的概念。unit 是由一个与配置文件对应的名字和类型组成的(例如:avahi.service unit 有一个具有相同名字的配置文件,是守护进程 Avahi 的一个封装单元)。unit 有以下几种类型:
Systemd unit 的文件目录说明如下:
5.1.1.1. 主要特性
systemd 提供以下特性:
Ø 基于 socket 的并行性能:为了加速整个系统启动和并行启动更多的进程, systemd 在实际启动守护进程之前创建 socket,然后传递 socket 给守护进程。在 系统初始化时,首先为所有守护进程创建 socket,然后再启动所有的守护进程。 如果一个服务因为需要另一个服务的支持而没有完全启动,而这个连接可能正在提供服务的队列中排队,那么这个客户端进程在这次请求中就处于阻塞状态。不过只会有这一个客户端进程会被阻塞,而且仅是在这一次请求中被阻塞。服务间的依赖关系也不再需要通过配置来实现真正的并行启动(因为一次开启了所有的socket,如果一个服务需要其他的服务,它显然可以连接到相应的 socket)。
Ø D-Bus 激活策略启动服务:通过使用总线激活策略,服务可以在接入时马上启动。同时,总线激活策略使得系统可以用微小的消耗实现 D-Bus 服务的提供者与消费者的同步开启请求。(同时开启多个服务,如果一个比总线激活策略中其他服务快就在 D-Bus 中排队其请求,直到其他管理确定自己的服务信息为止)。
Ø 提供守护进程的按需启动策略。
Ø 保留了使用 Linux cgroups 进程的追踪功能:每一个执行了的进程获得它自己的一个cgroup,配置 sysytemd 使其可以存放在 cgroup 中已经经过外部配置的服务非常简单。(如使用 libcgroups utilities)。
Ø 支持快照和系统状态恢复:快照可以用来保存/恢复系统初始化时所有的服务和 unit 的状态。它有两种主要的使用情况:允许用户暂时进入一个像"Emergency Shell"的特殊状态,终止当前的服务;提供一个回到先前状态的简单方法,重新启动先前暂时终止的服务。
Ø 维护挂载和自挂载点:systemd 监视所有的挂载点的进出情况,也可以用来挂载或卸载挂载点。/etc/fstab 也可以作为这些挂载点的一个附加配置源。通过使用 comment=fstab 选项您甚至可以标记/etc/fstab 条目使其成为由 systemd 控制的自挂载点。
Ø 现了各服务间基于依赖关系的一个精细的逻辑控制:systemd 支持服务(或 unit)间的多种依赖关系。在 unit 配置文件中使用 After/Before、Requires 和Wants 选项可以固定 unit 激活的顺序。Requires 和 Wants 表示一个正向(强制或可选)的需求和依赖关系,Conflicts 表示一个负向的需求和依赖关系。其他选项较少用到。如果一个 unit 需要启动或关闭,systemd 就把它和它的依赖关系添加到临时执行列表,然后确认它们的相互关系是否一致(或所有 unit 的先后顺序是否含有循环)。如果答案是否的话,systemd 将尝试修复它,删除可以消除循环的无用工作。
5.1.1.2. 兼容性
Ø 与 SysV 初始化脚本兼容:如果可能,它会利用 LSB 和 chkconfig 的头信息内容,否则,就使用其他可用信息,如:/etc/rc.d。这些初始化脚本仅仅作为一个附加的配置源,以减少 sysytemd 服务固有的路径数目。
Ø /etc/fstab 配置文件:这只是另一个配置源。通过使用 comment=fstab 选 项标记/etc/fstab 条目,使 systemd 可以控制自挂载点。
Ø 支持简单的模板/实例机制:例如只有一个作为示例的 getty@.service 文 件,而不是为六个 getty 都准备一个配置文件。接口部分甚至可以被直接继承, 也 就 是 说 , 可 以 简 单 的 调 用 avahi-autoipd@eth0.service 服务配置 dhcpcd@eth0.service,使得字符串 eth0 的值可以直接通过通配符匹配得到。
Ø 在一定程度上兼容/dev/initctl 。这个兼容性实际上是为了执行 FIFO-activated 服务。(只是简单地把原先的请求转换成为 D-Bus 请求)事实上, 这也意味着旧的 Upstart 和 sysvinit 中的shutdown、poweroff 和其他相似命令可以 在 systemd 中继续使用。
Ø 与 utmp 和 wtmp 兼容。
Ø 它可以控制由它催生的每一个程序。
Ø 本地配置文件使用与.desktop 文件相近的语法:很多软件架构中都有这 个简单的语法的分析器。它也可以借用已有的国际化的服务描述工具,语法都是相似的,没有必要再学习新的语法。
5.1.2. 管理系统服务
systemctl 是最主要的工具。它融合 service 和 chkconfig 的功能于一体。您可以使用它永久性或只在当前会话中启用/禁用服务。
5.1.2.1. 显示服务
输出激活的单元:
#systemctl
以下命令等效:
#systemctl list-units
如需输出激活服务的单元,执行以下命令:
#systemctl list-units --type service
输出加载服务的单元,执行以下命令:
#systemctl list-units --type service --all
输出所有服务的单元,执行以下命令:
#systemctl list-unit-files --type service
以下为显示当前所有激活服务的命令:
#systemctl list-units --type service
显示所有已安装服务单元命令如下:
#systemctl list-unit-files --type service
5.1.2.2. 显示服务状态
显示服务状态命令:
#systemctl status name.service
显示 firewalld.service 服务状态示例:
#systemctl status firewalld.service
显示 firewalld.service 服务启动前置依赖服务示例:
#systemctl list-dependencies --after firewalld.service
显示 firewalld.service 服务启动后导服务示例:
#systemctl list-dependencies --before firewalld.service
5.1.2.3. 启动服务
启动服务命令:
#systemctl start name.service
启动 httpd 服务示例:
#systemctl start httpd.service
5.1.2.4. 停止服务
停止服务命令:
#systemctl stop name.service
停止 httpd 服务示例:
#systemctl stop httpd.service
5.1.2.5. 重启服务
重启服务命令:
#systemctl restart name.service
重启 httpd 服务示例:
#systemctl restart httpd.service
仅重启正在运行的服务命令:
#systemctl try-restart name.service
重载服务命令:
#systemctl reload name.service
重载 httpd 服务示例:
#systemctl reload httpd.service
5.1.2.6. 启用服务
启用服务命令:
#systemctl enable name.service
重新启用服务命令:
#systemctl reenable name.service
启用 httpd 服务示例:
#systemctl enable httpd.service
Created symlink
/etc/systemd/system/multi-user.target.wants/httpd.service →
/usr/lib/systemd/system/httpd.service.
5.1.2.7. 禁用服务
禁用服务命令:
#systemctl disable name.service
禁用 bluetooth 服务示例:
#systemctl disable bluetooth.service
Removed /etc/systemd/system/dbus-org.bluez.service.
Removed /etc/systemd/system/bluetooth.target.wants/bluetooth. service.
5.1.3. 管理目标
启动级别(runlevel)是一个旧的概念。现在,systemd 引入了一个和启动级别功能相似又不同的概念——目标(target)。不像数字表示的启动级别,每个目标都有名字和独特的功能,并且能同时启用多个。一些目标继承其他目标的服务,并启动新服务。systemd 提供了一些模仿sysvinit 启动级别的目标,仍可以使用旧的 telinit 启动级别命令切换。
启动级别 0、1、3、5、6 都被赋予特定用途,并且都对应一个 systemd 的目标。要实现用户自定义启动级别功能,可以以原有的启动级别为基础,创建一个新的目标 /etc/systemd/system/< 新目标 > (可以参考 /usr/lib/systemd/system/graphical.target),创建/etc/systemd/system/<新目标>.wants 目录,向其中加入额外服务的链接(指向/usr/lib/systemd/system/中的单元文件)。
5.1.3.1. 查看默认目标
查看默认目标命令:
#systemctl get-default
以下为查看默认目标单元的示例:
#systemctl get-default
graphical.target
5.1.3.2. 查看当前目标
查看当前目标命令:
#systemctl list-units --type target
输出加载目标的单元,执行以下命令:
#systemctl list-units --type target --all
以下为显示当前所有激活目标的示例:
#systemctl list-units --type target
5.1.3.3. 变更默认目标
变更默认目标命令:
#systemctl set-default name.target
以下变更多用户目标示例:
#systemctl set-default multi-user.target
Remove /etc/systemd/system/default.target
Created symlink
/etc/systemd/system/default.target → /usr/lib/systemd/system/multi-user.target.
5.1.3.4. 变更当前目标
变更当前目标命令:
#systemctl isolate name.target
以下变更多用户目标示例:
#systemctl isolate multi-user.target
5.1.3.5. 切换救援模式
systemd.unit=rescue.target 是一个设置基本系统和救援 shell 的特殊 target unit (与运行级 1 相似);
进入救援模式命令:
#systemctl rescue
如果需要进入救援模式且不输出日志,输以下命令:
#systemctl --no-wall rescue
切换救援模式示例:
#systemctlrescue
5.1.3.6. 切换紧急模式
systemd.unit=emergency.target 与传递保留参数的 init=/bin/sh 给系统使系统从该状态启动相似。
进入紧急模式命令:
#systemctl emergency
如果需要进入紧急模式且不输出日志,输以下命令:
#systemctl --no-wall emergency
5.1.4. 在远程机器上使用 systemd
连接远程机器使用 systemd 命令如下:
#systemctl --host user_name@host_name command
远程管理命令举例:
#systemctl -H root@server-01.example.com status httpd.service
5.1.5. 创建和修改 systemd 单元文件
5.1.5.1. 单元文件介绍
单元文件通常包括三个部分:
【Unit】:通用配置项,包括该 unit 的基本信息。
【Unit type】:Unit 类型,不同类型定义可以参考 systemd 简介内容。
【Install】:包括需要被安装、启用和禁用的服务内容。
下面是 postfix.service 单元文件的示例:
[Unit]Description=Postfix Mail Transport AgentAfter=syslog.target network.targetConflicts=sendmail.service exim.service[Service]Type=forkingPIDFile=/var/spool/postfix/pid/master.pidEnvironmentFile=/etc/sysconfig/networkExecStartPre=/usr/libexec/postfix/aliasesdbExecStartPre=/usr/libexec/postfix/chroot-updateExecStart=/usr/sbin/postfix startExecReload=/usr/sbin/postfix reloadExecStop=/usr/sbin/postfix stop[Install]WantedBy=multi-user.target
这个示例中,【Unit】字段表述服务名称与依赖冲突信息。【Service】包括基本的服务信息。EnvironmentFile 表述预定义的该服务的环境变量,PIDFile 表示服务使用静态的 PID。最后,【Install】字段显示依赖该服务的内容。
5.1.5.2. 创建自定义单元文件
创建自定义单元文件的步骤:
1)准备自定义服务的执行文件。
可执行文件可以是脚本,也可以是软件提供者的程序,如果需要,为自定义服务的主进程准备一个 PID 文件,一保证 PID 保持不变。另外还可能需要的配 置环境变量的脚本,确保所有脚本都有可执行属性并且不需要交互。
2)在/etc/systemd/system/目录创建单元文件,并且保证只能被 root 用户编辑:
#touch /etc/systemd/system/{name}.service
#chmod 664 /etc/systemd/system/{name}.service
文件不需要执行权限。
3)打开{name}.service 文件,添加服务配置,各种变量如何配置视所添加的 服务类型而定,下面是一个依赖网络服务的配置例子:
[Unit]Description=service_descriptionAfter=network.target[Service]ExecStart=path_to_executableType=forkingPIDFile=path_to_pidfile[Install]WantedBy=default.target
4)通知 systemd 有个新服务添加:
#systemctl daemon-reload
#systemctl start name.service
创建 emacs.service 文件的例子:
1)创建文件,并确保正确权限:
#touch /etc/systemd/system/emacs.service
#chmod 664 /etc/systemd/system/emacs.service
2)添加配置信息:
[Unit]Description=Emacs:theextensible,self-documentingtexteditor[Service]Type=forkingExecStart=/usr/bin/emacs--daemonExecStop=/usr/bin/emacsclient--eval"(kill-emacs)"Environment=SSH_AUTH_SOCK=%t/keyring/sshRestart=always[Install]WantedBy=default.target
3)通知 systemd 并开启服务:
#systemctl daemon-reload
#systemctl start emas.service
创建 sshd-second 服务的例子:
1)拷贝 sshd_config 文件为 sshd-second.config
#cp /etc/ssh/sshd{,-second}_config
2)编辑 sshd-second_config 文件,添加 22220 的端口,和 PID 文件:
Port 22220
PidFile /var/run/sshd-second.pid
如果还需要修改其他参数,请阅读帮助。
3)拷贝单元文件:
#cp /usr/lib/systemd/system/sshd{,-second}.service
4)编辑单元文件/usr/lib/systemd/system/sshd-second.service
修改描述字段:
Description=OpenSSH server daemon
添加 sshd.service 服务在 After 关键字之后:
After=syslog.target network.target auditd.service sshd.service
移除 sshdkey 创建:
ExecStartPre=/usr/sbin/sshd-keygen
在执行脚本里,添加第二个 sshd 服务的配置文件:
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS
修改后的 sshd-second.service 文件内容如下:
ExecStart=/usr/sbin/sshd-D-f/etc/ssh/sshd-second_config $OPTIONS
5)如果使用 SELinux,添加 tcp 端口,负责 sshd-second 服务的端口就会被拒绝绑定:
#semanage port -a -t ssh_port_t -p tcp 22220
6)设置开机启动并测试:
#systemctl enable sshd-second.service
#ssh -p 22220 user@server
确保防火墙端口也开放。
5.1.5.3. 修改已经存在的单元文件
systemd 单元配置文件默认保存在/usr/lib/systemd/system/目录,系统管理员 不建议直接修改这个目录下的文件,自定义的文件在/etc/systemd/system/目录下, 如果有扩展的需求,可以使用以下方案:
创建一个目录/etc/systemd/system/unit.d/,这个是最推荐的一种方式,可以参考初始的单元文件,通过附件配置文件来扩展默认的配置,对默认单元文件的升级会被自动升级和应用。
从/usr/lib/systemd/system/拷贝一份原始配置文件到/etc/systemd/system/,然后修改。复制的版本会覆盖原始配置,这种方式不能增加附件的配置包,用于不需要附加功能的场景。
如果需要恢复到默认的配置文件,只需要删除/etc/systemd/system/下的配置文件就可以了,不需要重启机器,使用如下命令应用改变就可以:
#systemctl restart name.service
扩展默认单元配置文件
为了扩展默认的单元文件配置,需要先在/etc/systemd/system/下创建一个目录,用 root 执行类似下面的命令:
#mkdir /etc/systemd/system/name.service.d
在刚才创建的目录之下创建配置文件,必须以.conf 文件结尾。例如创建一个自定义的依赖文件,内容如下:
[Unit]
Requires=new_dependency
After=new_dependency
另外一个例子,可以配置重启的时候,在主进程退出后 30 秒在重启,配置例子如下:
[Unit]
Requires=new_dependency
After=new_dependency
推荐每次只产生一个小文件,每个文件只聚焦完善一个功能,这样配置文件很容易被移除或者链接到其他服务的配置目录中。为了应用刚才的修改,使用 root 执行以下操作:
systemctl daemon-reload
systemctl restart name.service
例子:扩展 httpd.service 服务配置
为了使 httpd 服务启动的时候执行用户自定义的脚本,需要修改 httpd 的单元配置文件,执行以下几步操作,首先创建一个自定义文件的目录及自定义文件:
#mkdir /etc/systemd/system/httpd.service.d
#touch /etc/systemd/system/httpd.service.d/custom_script.conf
假设自定义文件位置在/usr/local/bin/custom.sh,将这个信息添加到custom_script.conf 自定义脚本中:
[Service]
ExecStartPost=/usr/local/bin/custom.sh
应用更改:
#systemctl daemon-reload
#systemctl restart httpd.service
SSH(Secure Shell)是一个使用客户端-服务端架构,使得两个系统之间的安全通信变得容易的协议,它能够让用户远程登录到服务端主机系统中。和其它诸如 FTP 或者 Telnet 的远程通信协议不同,SSH 加密了登录会话,致使入侵者难以通过连接获取未加密的密码。
ssh 程序被设计用于替换诸如 telnet 或者 rsh,这些比较旧的、安全性不高的、用来登录远程主机系统的终端应用程序。与其相关的一个叫做 scp 的程序,用于替换诸如 rcp 这样用来在主机之间复制文件的老程序。因为这些老旧的应用程序不会加密在客户端和服务端之间传递的密码,所以应该尽可能地避免使用它们。使用安全方法登录远程系统,能够同时降低客户端系统和远程主机系统的风险。
银河麒麟高级服务器操作系统包含了通用的 OpenSSH 安装包——openssh, 以及 OpenSSH 服务端安装包——openssh-server 和 OpenSSH 客户端安装包 ——openssh-clients。注意,OpenSSH 安装包依赖于 OpenSSL 的安装包openssl-libs,这个包安装了几个重要的加密库,使得 OpenSSH 能够提供加密通信。
5.2.1. SSH 协议
5.2.1.1. 为什么使用 SSH?
潜在的入侵者有许多可以使用的工具,能够让他们中断、拦截和重新路由网 络流量,从而试图获取对一个系统的访问权限。一般来说,这些威胁可以分为以 下几类:
1) 拦截两个系统之间的通信
攻击者可能位于通信双方所在网络中的某处,复制他们之间传递的任何信息。 他可能会拦截并保留信息,或者修改信息后将其发送给计划中的接收者。这种攻击通常是通过使用数据包嗅探器来进行的,数据包嗅探器是一种非常常见的网络工具,可以用来捕获网络流中的数据包,并分析其内容。
2) 冒充特定主机
攻击者的系统被配置来冒充传送的预期接收者。如果攻击者的策略成功了, 用户系统将不会发现它其实是在跟一个错误的主机进行通信。这种攻击可以通过使用一种名为“DNS 缓存投毒”的技术,或者通过所谓的“IP 欺骗”来实现。在第一种示例中,入侵者使用一台被攻破的 DNS 服务器来将客户系统指向一台恶意复制主机。在第二种示例中,入侵者发送伪造的网络数据包,让这个数据包看起来好像是从一台可信任的主机发出的。
这些技术都能够拦截可能存在的敏感信息,而且如果这些拦截是出于怀有敌 意的原因,那么结果将是灾难性的。如果使用 SSH 来进行远程登录和文件复制, 那么就能够极大地减少这些安全威胁。这是因为 SSH 客户端和服务端使用数字 签名来验证身份。此外,客户端和服务端系统之间的所有通信都是加密的。不管 尝试在通信的哪一方进行身份欺骗都是行不通的,因为每一个数据包都是使用一 个只有本地系统和远程系统才知道的密钥来加密的。
5.2.1.2. 主要特性
SSH 协议提供了以下保护措施:
1) 无法伪装预期的服务端
在初始连接之后,客户端能够验证它当前所连接的服务端的确是它之前所连接过的同一个服务端。
2) 无法捕获认证信息
客户端使用强 128 位加密算法来将它的认证信息传递给服务端。
3) 无法拦截通信
在一个会话中所有发送和接收的数据都是使用 128 位加密算法加密的,使得拦截到的传输内容要解密阅读是极度困难的。
此外,SSH 协议还提供了以下选项:
1) 提供了在网络上使用图形化应用程序的安全手段
通过使用名为“X11 转发”的技术,客户端能够从服务端转发 X11(X 窗口系统)应用程序。
2) 提供了一种保护其它不安全协议的方式
SSH 协议对它发送和接收的一切进行加密。通过使用名为“端口转发”的技术, SSH 服务端可以成为一个保护其它不安全协议(例如 POP)的导管,从而增加
整体系统和数据的安全性。
3) 可以用来创建安全通道
OpenSSH 服务端和客户端可以被配置来为服务端和客户端机器之间的网络流,创建一个类似于虚拟专用网络的隧道。
4) 支持 Kerberos 认证
OpenSSH 服务端和客户端可以被配置为使用 Kerberos 网络认证协议的GSSAPI(通用安全服务应用程序编程接口)实现来进行认证。
5.2.1.3. 协议版本
SSH 目前存在两个版本:版本 1 和较新的版本 2。银河麒麟高级服务器操作系统中的OpenSSH 套件使用 SSH 版本 2,该版本具有增强的密钥交换算法,不易受到版本 1 中已知漏洞的攻击。然而,为了兼容性的原因,OpenSSH 套件同样也支持版本 1 的连接。
重要说明:
为了确保您的连接的最佳安全性,建议您只要可能就使用只兼容 SSH 版本 2的服务端和客户端。
5.2.2. SSH 连接的事件序列
以下一系列事件可以保护两个主机之间的 SSH 通信的完整性。
1) 进行加密握手,以便客户端能够验证它正在跟正确的服务端进行通信;
2) 采用对称加密算法对客户端和远程主机之间的连接的传输层进行加密;
3) 客户端向服务端进行自我认证;
4) 客户端通过加密连接和远程主机进行交互。
5.2.2.1. 传输层
传输层的主要角色是确保两个主机之间的通信是安全可靠的,包括在认证的时候以及在随后的通信期间。传输层通过对数据进行加密和解密处理,以及通过提供对数据包发送和接收时的完整性保护,来实现这一目标。传输层也提供压缩、加速信息传输的功能。
SSH 客户端联系服务端时,将进行密钥交换,使得两个系统之间能够正确地构建传输层。密钥交换时的步骤如下:
1) 交换密钥;
2) 确定公钥加密算法;
3) 确定对称加密算法;
4) 确定消息认证算法;
5) 确定哈希算法。
在密钥交换期间,服务端用一个唯一的主机密钥向客户端表明自己的身份。 如果客户端以前从未和这个特定的服务端通信过,服务端的主机密钥对于客户端 来说是未知的,客户端将不会连接。OpenSSH 通过接受服务端的主机密钥来规 避这个问题。用户知晓,并且新的主机密钥已经被接受和验证之后,继续后续过 程。在之后的连接中,客户端会用已保存的版本来检查服务端的主机密钥,以确 保客户端确实是在和预期的服务端通信。如果在将来主机密钥发生了变化,用户 必须在连接之前删除客户端已经保存的版本。
重要说明:
攻击者可能会在最初的联系阶段伪装成 SSH 服务端,因为本地系统并不知道预期的服务端和攻击者设置的假服务端之间有什么区别。为了防止这样的事情发生,请在第一次连接或者主机密钥不匹配时,联系服务端管理员以验证 SSH 服务端的真实完整性。
SSH 被设计成几乎可以和任何类型的公钥算法或者编码格式兼容。在最初的密钥交换创建了一个用于交换的哈希值和一个共享的密值后,两个系统立即开始计算新的密钥和算法,以保护将在连接上发送的认证和数据。在使用指定的密钥和算法传输一定量(准确的量取决于 SSH 实现)的数据之后,将会发生又一次密钥交换,生成另一套哈希值和一个新的共享密值。即使攻击者能够确定哈希值和共享密值,这一信息也仅在非常有限的一段时间内有用。
5.2.2.2. 认证
一旦传输层构建好一个安全隧道在两个系统之间传递信息,服务端告知客户端其所支持的不同的认证方法,例如使用一个私钥编码的签名,或者输入一个密码。然后客户端尝试使用所支持的其中一种方法向服务端进行认证。SSH 服务端和客户端可以配置使用不同类型的认证方式,让各方都具有最佳的控制度。服务端可以决定基于其安全模型,它可以支持哪些加密方法;客户端可以从可用的选项中选择尝试认证方法的顺序。
5.2.2.3. 通道
在 SSH 传输层完成一次成功的认证之后,将会通过被称为“多路技术”(多路复用连接由多个信号组成,这些信号通过一个共享的、通用的介质进行发送。对 SSH 来说,不同的通道都在一个共同的安全连接中发送)的一种技术打开多重通道。每一条通道负责处理不同的终端会话和转发 X11 会话。不论是客户端还是服务端都可以创建新的通道。每一个通道将在连接的两端被赋予一个编号。当客户端尝试打开一个新的通道时,客户端把请求和通道编号一起发送出去。这些信息被服务端保存起来,用于将通信导向对应的通道。如此一来,不同类型的会话不会相互影响,并且当一个指定的会话结束之后,关闭它的通道不会中断主要的 SSH 连接。
通道也可以支持流控制,可以让通道以一种有秩序的方式发送和接收数据。以这种方式,只有当客户端接收到通道已经打开的消息,数据才会通过通道发送。客户端和服务端自动协商每条通道的特征,取决于客户端请求的服务类型以及用户连接到网络的方式。这样可以在不必改变协议的基础设施的情况下,为处理不同类型的远程连接带来很大的灵活性。
5.2.3. 配置 OpenSSH
5.2.3.1. 配置文件
配置文件有两个不同的系列,一系列用于客户端程序(例如 ssh、scp 和 sftp),另外一系列用于服务端(sshd 守护进程)。
系统范围的 SSH 配置信息保存在/etc/ssh/目录下,详见表 5-11 系统范围的配置文件。特定用户的 SSH 配置信息保存在~/.ssh/目录下(该目录在特定用户的家目录里),详见表 5-12 特定用户的配置文件。
获取有关 SSH 配置文件中所使用的各种指令的信息,请参考 ssh_config(5) 和 sshd_config(5)手册页面。
5.2.3.2. 启动 OpenSSH 服务端
您必须安装 openssh-server 包之后才能运行 OpenSSH 服务端。
要在当前会话中启动 sshd 守护进程,请以 root 用户在 shell 命令行提示符下输入以下命令:
#systemctl start sshd.service
要在当前会话中停止运行 sshd 守护进程,请以 root 用户在 shell 命令行提示符下输入以下命令:
#systemctl stop sshd.service
如果您想在系统启动时自动启动守护进程,请以 root 用户在 shell 命令行提示符下输入以下命令:
#systemctl enable sshd.service
Created symlink
/etc/systemd/system/multi-user.target.wants/sshd.service →
/usr/lib/systemd/system/sshd.service.
5.2.3.3. 使用 SSH 进行远程连接
为了让 SSH 真正发挥作用,应该禁止使用不安全的连接协议。否则,用户的密码可能在一个会话中使用 SSH 时被保护得很好,但是却在之后使用 Telnet 登录时被捕获了。需要禁用的服务包括 telnet、rsh、rlogin 和 vsftpd。
5.2.3.4. 使用基于密钥的认证
为了更进一步的提高系统安全,可以生成 SSH 密钥对,然后强制使用基于密钥的认证,并禁用密码认证。要这样做,请在 vi 或者 nano 等文本编辑器中打开/etc/ssh/sshd_config 配置文件,并将 PasswordAuthentication 选项修改为如下内容:
PasswordAuthentication no
如果您不是在一个新的默认安装的系统中进行操作,请检查配置文件确保没有设置PubkeyAuthentication no 选项。如果是远程连接上的,而不是使用的控制台或者带外访问,建议在禁用密码认证之前先测试基于密钥的登录过程是否可用后再配置 PubkeyAuthentication 为 no。
为了能够使用 ssh、scp 或者 sftp 从一个客户端机器连接到服务端,请按照
5.2.3.5 生成秘钥对
章节生成一个授权密钥对。注意,这些密钥必须针对每个用户分别生成。
银河麒麟高级服务器操作系统V10默认使用版本2的SSH协议和RSA密钥。
重要说明:
如果您以 root 的身份完成了步骤,那么只有 root 用户能够使用这些密钥。
备注:
如果您要重装您的系统,又想保留之前生成的密钥对,请备份~/.ssh/目录。
在重装后,将其复制回您的家目录。这一过程需要让系统上的所有用户执行,包括 root 用户。
5.2.3.5. 生成密钥对
要生成 SSH 协议版本 2 的 RSA 密钥对,请按以下步骤操作:
1) 在 shell 命令行提示符下输入以下命令生成 RSA 密钥对:
$ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/USER/.ssh/id_rsa):
2) 按回车键确认新创建的密钥的默认路径,即~/.ssh/id_rsa。
3) 输入一个口令,并且在提示确认的时候再次输入该口令。为了安全起见, 请不要使用和您登录您的账户相同的密码。
4) 默认情况下,将~/.ssh/目录的权限设置为 rwx------或者以八进制标注表 示的 700。这是为了确保只有对应的用户 USER 能够查看其内容。如果有必要,可以使用以下命令来进行确认:
$ls -ld ~/.ssh
drwx------. 2 USER USER 54 Nov 25 16:56 /home/USER/.ssh/
5) 使用以下格式的命令,将公钥复制到一台远程机器上:
ssh-copy-id user@hostname
如果公钥尚未安装的话,该命令会复制最近一次修改的~/.ssh/id*.pub 公钥。
可选的,您也可以指定公钥的文件名:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@hostname
该命令会将~/.ssh/id_rsa.pub的内容复制到您想连接的机器的 ~/.ssh/authorized_keys 文件中。如果 authorized_keys 文件已经存在了,密钥将会追加到该文件的末尾。
要生成 SSH 协议版本 2 的 ECDSA 密钥对,请按以下步骤操作:
1) 在 shell 命令行提示符下输入以下命令生成 ECDSA 密钥对:
$ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/USER/.ssh/id_ecdsa):
2) 按回车键确认新创建的密钥的默认路径,即~/.ssh/id_ecdsa。
3) 输入一个口令,并且在提示确认的时候再次输入该口令。为了安全起见,请不要使用和您登录您的账户相同的密码。
4) 默认情况下,将~/.ssh/目录的权限设置为 rwx------或者以八进制标注表示的700。这是为了确保只有对应的用户 USER 能够查看其内容。如果有必要,可以使用以下命令来进行确认:
$ls -ld ~/.ssh
drwx------. 2 USER USER 54 Nov 25 16:56 /home/USER/.ssh/
5) 使用以下格式的命令,将公钥复制到一台远程机器上:
ssh-copy-id user@hostname
如果公钥尚未安装的话,该命令会复制最近一次修改的~/.ssh/id*.pub 公钥。可选的,您也可以指定公钥的文件名:
ssh-copy-id -i ~/.ssh/id_ecdsa.pub user@hostname
该命令会将 ~/.ssh/id_ecdsa.pub 的内容复制到您想连接的机器的 ~/.ssh/authorized_keys 文件中。如果 authorized_keys 文件已经存在了,密钥将会追加到该文件的末尾。
重要说明:
私钥仅供您个人使用,绝不要把它给任何人,这一点是非常重要的。
5.2.3.6. OpenSSH 客户端
您必须安装 openssh-clients 包后,才能从客户端机器连接到一个 OpenSSH服务端(请参见 4.2.4 安装软件包。了解如何在银河麒麟高级服务器操作系统中安装新的包)。
5.2.3.7. 使用 ssh 工具
ssh 工具可以让您登录到一台远程机器上,并在上面执行命令。它是对 rlogin、rsh 和 telnet 程序的一个安全替换。和 telnet 命令相似,使用以下命令登录到一台远程机器上:
ssh hostname
例如,要登录到一台名为 penguin.example.com 的远程主机,可以在 shell 命令行提示符下输入以下命令:
#ssh penguin.example.com
该命令将会以您正在使用的本地机器的用户名登录。如果您想指定一个不同
的用户名,请使用以下命令:
ssh username@hostname
例如,以 USER 登录到 penguin.example.com,请输入以下命令:
$ssh USER@penguin.example.com
您第一次连接时,将会看到和如下内容相似的信息:
The authenticity of host 'penguin.example.com' can't be established.
ECDSA key fingerprint is
SHA256:Ixy64icRYc/h7XSOvUVywS7t7ThtmOsPT1s07wDD5P8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
在回答对话框中的问题之前,用户应该始终检查指印是否正确。用户可以询问服务端的管理员以确认密钥是正确的。这应该以一种安全的、事先约定好的方式进行。如果用户可以使用服务端的主机密钥,可以使用以下 ssh-keygen 命令来检查指印:
#ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:b0gGbI+Xk/l+Ve76j3mqpYSty0n3gR9QiIsd+8oV3GI no
comment (ECDSA)
输入 yes 接受密钥并确认连接。您将会看到一个有关服务端已经被添加到已
知的主机列表中的通告,以及一个输入密码的提示:
Warning: Permanently added 'penguin.example.com' (ECDSA) to the list
of known hosts.
USER@ penguin.example.com's password:
重要说明:
如果 SSH 服务端的主机密钥改变了,客户端将会通知用户连接不能继续, 除非将服务端的主机密钥从~/.ssh/known_hosts 文件中删除。然而,在进行此操 作之前,请联系 SSH 服务端的系统管理员,验证服务端没有受到攻击。
要从~/.ssh/known_hosts 文件中删除一个密钥,可以使用如下命令:
#ssh-keygen -R penguin.example.com
在输入密码之后,您将会进入远程主机的 shell 命令行提示符下。
可选地,ssh 程序可以用来在远程主机上执行一条命令,而不用登录到 shell
命令行提示符下:
ssh [username@]hostname command
例如,/etc/kylin-release 文件提供有关操作系统版本的信息。要查看penguin.example.com 上该文件的内容,输入:
$ssh USER@penguin.example.com cat /etc/kylin-release
USER@penguin.example.com's password:
Kylin Linux Advanced Server release V10 (Lance)
在您输入正确的密码之后,将会显示远程主机的操作系统版本信息,然后您
将返回到本地的 shell 命令行提示符下。
5.2.3.8. 使用 scp 工具
scp 可以用来在主机之间通过一个安全加密的连接传输文件。在设计上,它和 rcp 非常相似。要传输一个本地文件到远程系统中,可以使用如下形式的命令:
scp localfile username@hostname:remotefile
例如,如果您想将 taglist.vim 传输到名为 penguin.example.com 的远程主机用户家目录上,可以在 shell 命令行提示符下输入以下命令:
#scp taglist.vim USER@penguin.example.com:~
一次可以指定多个文件。要传输.vim/plugin/目录下的文件和目录到远程主机
penguin.example.com 的相同目录下,可以输入以下命令:
$scp -r .vim/plugin/* USER@penguin.example.com:.vim/plugin/
要将一个远程的文件传输到本地系统上,可以使用以下语法:
scp username@hostname:remotefile localfile
例如,要从远程主机上下载.vimrc 配置文件,可以输入:
$scp USER@penguin.example.com:.vimrc .vimrc
5.2.3.9. 使用 sftp 工具
sftp 工具可以用来打开一个安全的、交互式的 FTP 会话。在设计上,它类似于 ftp,不同之处在于 sftp 使用了一个安全的加密连接。要连接到远程系统中,可以使用如下形式的命令:
sftp username@hostname
例如,要使用 USER 用户登录到名为 penguin.example.com 的远程主机上,
可以输入:
$sftp USER@penguin.example.com
USER@penguin.example.com's password:
Connected to penguin.example.com.
sftp>
当您输入正确的密码之后,您将会看到一个 sftp 的命令行提示符。sftp 工具可以使用一系列和 ftp 类似的命令(参见表 5- 13)。
要获取可用命令的完整列表,请参考 sftp(1)用户手册页面。
5.2.4. 不只是一个安全的 Shell
一个安全的命令行界面只不过是 SSH 众多使用方式的开端。给予合适的带
宽,可以通过 SSH 通道进行 X11 会话的转发。或者,通过 TCP/IP 转发,系统间以前的不安全端口连接可以映射到指定的 SSH 通道上。
5.2.4.1. X11 转发
要通过 SSH 连接打开 X11 会话,可以使用以下形式的命令:
ssh -Y username@hostname
例如,要使用 USER 用户登录到名为 penguin.example.com 的远程主机上, 可以输入:
$ssh -Y USER@penguin.example.com
USER@penguin.example.com's password:
当从安全 shell 命令行提示符下运行一个 X 程序时,SSH 客户端和服务端会创建一个新的安全通道,X 程序数据通过这个通道透明地发送到客户端机器上。
注意,在发生 X11 转发之前,必须在远程系统中安装好 X 窗口系统。以 root用户输入以下命令可以安装 X11 软件包分组:
#dnf group install "X Window System"
要了解关于软件包分组的更多信息,请参见 4.2 管理软件包。
X11 转发非常有用。例如,X11 转发可以用来为【打印设置】工具创建一个 安全的交互式会话。要这样做,先使用 ssh 连接到服务端,然后输入:
$system-config-printer &
【打印设置】工具将会显示出来,让远程用户可以在远程主机上安全地配置打印。
5.2.4.2. 端口转发
SSH 可以通过端口转发安全加固其他不安全的 TCP/IP 协议。在使用这一技术时,SSH 服务端成为了 SSH 客户端的一个加密导管。 端口转发的工作原理是将客户端的一个本地端口映射到服务端的一个远程端口上。SSH 可以从服务端将任意端口映射到客户端的任意端口上。这一技术并不需要端口号互相匹配。
重要说明:
要设置端口转发监听 1024 以下的端口,需要 root 级别的访问权限。
要创建一个监听 localhost 上的连接的 TCP/IP 端口转发通道,可以使用以下 形式的命令:
ssh -L local-port:remote-hostname:remote-port username@hostname
例如,要使用 POP3 通过一个加密连接检查名为 mail.example.com 的服务器上的邮件,可以使用以下命令:
$ssh -L 1100:mail.example.com:110 mail.example.com
一旦客户端机器和邮件服务器之间的端口转发通道准备就绪后,就可以使用
一个 POP3 邮件客户端在 localhost 上使用 1100 端口来检查新邮件了。任何在客户端系统上发往 1100 端口的请求,都将被安全地导向 mail.example.com 服务器。
如果 mail.example.com 没有运行 SSH 服务端,但是同一网络中的另一台机
器运行了 SSH 服务端,那么 SSH 仍然可以用来对连接进行安全加固。当然,使 用的命令会略有不同:
$ssh -L 1100:mail.example.com:110 other.example.com
在这一示例中,从客户端机器的 1100 端口发出的 POP3 请求,将通过 22 端口上的SSH连接被转发到SSH服务端other.example.com。然后,other.example.com 连接到 mail.example.com 上的 110 端口来检查新邮件。注意,在使用这一技术时,只有客户端和 other.example.com 服务端之间的连接是安全的。
端口转发也可以用来通过网络防火墙安全地获取信息。如果防火墙配置为允许放行使用标准端口(即 22 端口)的 SSH 数据流,但是阻塞了对其它端口的访问,那么在要在两台主机之间使用被阻塞端口建立连接仍然是可能的,只要将它们之间的通信通过一条建立好的 SSH 连接进行重定向即可。
重要说明:
以这种方式来使用端口转发技术对连接进行转发,将允许客户端系统上的任何用户都能连接到相应的服务上。如果客户端系统被入侵,攻击者也同样能够访问转发的服务。
担心端口转发的系统管理员,可以在服务端将/etc/ssh/sshd_config 文件中的AllowTCPForwarding 选项设置为 No,并重启 sshd 服务,来禁用端口转发功能。
TigerVNC(Tiger Virtual Network Computing)是一个图形化桌面共享系统,可以让您远程控制其它计算机。
TigerVNC 采用服务端-客户端架构:服务端共享它的输出(vncserver),客户端(vncviewer)连接到客户端。
重要说明:
相比以往银河麒麟高级服务器操作系统,银河麒麟高级服务器操作系统 V10中的TigerVNC使用systemd系统管理守护进程进配置。配置文件/etc/sysconfig/vncserver 被替换成了/etc/systemd/system/vncserver@.service。
5.3.1. VNC 服务端
vncserver 工具用来启动一个 VNC(Virtual Network Computing)桌面。它将使用适当的选项运行 Xvnc,并在 VNC 桌面中启动一个窗口管理器。vncserver允许用户在一台机器上并行地运行多个独立的会话,之后这些会话可以被任意数量的客户端从任意位置访问。
5.3.1.1. 安装 VNC 服务端
要安装 TigerVNC 服务端,请以 root 用户执行以下命令:
#dnf install tigervnc-server
5.3.1.2. 配置 VNC 服务端
VNC 服务端可以被配置了为一个或多个用户(倘若这些用户账户存在于系统上)启动一个显示,可以配置诸如显示设置、网络地址和端口,以及安全设置等可选参数。
(1) 为指定用户复制vncserver@.service文件到/etc/systemd/system目录 ( 以 smbuser 用户为例)
#cp /usr/lib/systemd/system/vncserver@.service
/etc/systemd/system/vncserver-smbuser@.service
(2) 修改 service 文件将
#vim /etc/systemd/system/vncserver-smbuser@.service
#The vncserver service unit file
#
#Quick HowTo:
#1. Copy this file to /etc/systemd/system/vncserver@.service
#2. Replace
with the actual user name and edit vncserver #
parameters appropriately
#3. Run `systemctl daemon-reload`
#4. Run `systemctl enable vncserver@:
.service` #
#DO NOT RUN THIS SERVICE if your local area network is
#untrusted! For a secure way of using VNC, you should
#limit connections to the local host and then tunnel from
#the machine you want to view VNC on (host A) to the machine
#whose VNC output you want to view (host B)
#
#[user@hostA ~]#ssh -v -C -L 590N:localhost:590M hostB
#
#this will open a connection on port 590N of your hostA to hostB's port 590M
#(in fact, it ssh-connects to hostB and then connects to localhost (on hostB).
#See the ssh man page for details on port forwarding)
#
#You can then point a VNC client on hostA at vncdisplay N of localhost and with
#the help of ssh, you end up seeing what hostB makes available on port 590M
#
#Use "-nolisten tcp" to prevent X connections to your VNC server via TCP.
#
#Use "-localhost" to prevent remote VNC clients connecting except when
#doing so through a secure tunnel. See the "-via" option in the
#`man vncviewer' manual page.
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
Type=forking
WorkingDirectory=/home/smbuser
User=smbuser
Group=smbuser
PIDFile=/home/smbuser/.vnc/%H%i.pid
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver -autokill %i
ExecStop=/usr/bin/vncserver -kill %i
Restart=on-success
RestartSec=15
[Install]
WantedBy=multi-user.target
(3) 执行 systemctl daemon-reload
5.3.1.3. 启动 VNC 服务端
要启动或者开机自启动 VNC 服务,请在命令行中指定显示编号。在 5.3.1.2配置 VNC 服务端下的示例:“为单一用户配置 VNC 显示”中使用的配置文件担任着模板的角色,文件中的%i 将被 systemd 用显示编号替换。使用一个有效的显示编号来执行以下命令:
#systemctl start vncserver-USER_1@:display_number.service
您也可以让服务在系统启动时自动启动。之后,当您登录时,vncserver 已经自动启动了。以 root 用户执行以下命令:
#systemctl enable vncserver-USER_1@:display_number.service
这时候,其他用户可以使用一个 VNC 查看程序,以及定义好的显示编号和密码来连接到 VNC 服务端。假若已经安装好了一个图形化桌面,将会显示该桌面的一个实例。这个实例和目标机器上正在显示的实例是不相同的。为两个用户和两个不同的显示配置 VNC 服务端 对于两个已经配置好的VNC服务端vncserver-USER_1@.service和vncserver-USER_2@.service,您可以启用不同的显示编号。例如,以下命令将会 使 USER_1 的 VNC 服务端在显示编号 3 上启动,而 USER_2 的 VNC 服务端将在显示编号 5 上启动:
#systemctl start vncserver-USER_1@:3.service
#systemctl start vncserver-USER_2@:5.service
5.3.1.4. 终止 VNC 会话
类似于启用 vncserver 的开机自启动,您也可以禁用该服务的开机自启动:
#systemctl disable vncserver-USER_1@:display_number.service
或者,当您的系统正在运行时,您可以以 root 用户执行以下命令来停止 VNC 服务:
#systemctl stop vncserver-USER_1@:display_number.service
5.3.2. 共享一个已存在的桌面
默认情况下,一个已登录的用户拥有一个由 X 服务端提供的、在显示编号 0上的桌面。用户可以使用 TigerVNC 服务端的 x0vncserver 来共享他们的桌面。
实例:共享一个 X 桌面
要使用 x0vncserver 共享一个已登录用户的桌面,请按以下步骤操作:
1) 以 root 用户执行以下命令:
#dnf install tigervnc-server
2) 为用户设置 VNC 密码:
#vncpasswd
Password:
Verify:
3) 以已登录用户的身份执行以下命令:
#x0vncserver -PasswordFile=.vnc/passwd -AlwaysShared=1
倘若防火墙已经配置了允许连接 5900 端口,远程查看器现在就可以连接到显示编号 0 上,并查看已登录用户的桌面了。请参见 5.3.3.2 为 VNC 配置防火墙。
5.3.3. VNC 查看器
vncviewer 是一个用来显示图形用户界面并远程控制 vncserver 的程序。为了操作 vncviewer,有一个包含许多条目的弹出菜单,通过这些条目可以执行诸如切换到/切换出全屏模式、退出查看器等多种操作。可选地,您也可以通过终端来操作 vncviewer。在命令行中输入 vncviewer -h 可以列出 vncviewer 的参数。
5.3.3.1. 安装 VNC 查看器
要安装 TigerVNC 的客户端 vncviewer,请以 root 用户执行以下命令:
#dnf install tigervnc
连接到 VNC 服务端一旦配置好了 VNC 服务端,您就可以从任何 VNC 查看器连接到该服务端 了。
5.3.3.2. 为 VNC 配置防火墙
当使用非加密连接时,firewalld 可能会阻止连接。为了让 firewalld 允许 VNC 数据包通过,您可以开放指定的 TCP 数据流端口。当使用-via 选项时,数据流通过 SSH 做了重定向,而 SSH 的端口在 firewalld 中默认是开放的。
备注:
VNC 服务端的默认端口是 5900。要得到远程桌面将被访问的端口号,可以用默认端口号加上用户分配的显示编号。例如,对于第二个显示屏:2 + 5900 = 5902。
5.3.3.3. 使用 SSH 连接到 VNC 服务端
VNC 是一个很明显的文本网络协议,在通信中没有相应的安全机制来应对可能的攻击。为了使通信安全,您可以通过使用-via 选项来加密您的服务端-客户端连接。这将会在 VNC 服务端和客户端之间创建一个 SSH 隧道。 加密 VNC 服务端-客户端连接的命令格式如下:
vncviewer -via user@host:display_number
来源地址:https://blog.csdn.net/weixin_57099902/article/details/130718030