本文目录
1. 序
之前在某国企实习的时候,有幸参与了鸿蒙系统、鸿蒙欧拉的项目,主要是做鸿蒙系统结合国家主要产业的设备进行工作测试,这里不涉及太多详细情况,主要是总结自己对鸿蒙操作系统的知识梳理和实习时的一些收获。
2.鸿蒙与欧拉的概念
OpenHarmony
是基于微内核、面向全场景的分布式操作系统
。并不是安卓系统修改而来的,与安卓、IOS是不一样的操作系统。
其内核可以认为是由 Linux内核、LiteOS、鸿蒙微内核
三个部分构成的多内核操作系统。 因为早期的研发是参考了Linux内核并以此为底层进行内核设计开发,所以兼容Linux应用程序(Debian系列的Linux内核
,其后缀为.deb
)。
鸿蒙微内核应该是参考Minix3
开发的( Minix3属于精简的类Unix系统
,使用的就是微内核
)。
因为是多内核的,所以OpenHarmony
引入了内核抽象层(Kernel Abstract Layer, KAL
),通过屏蔽不同内核之间的差异
,向上层提供统一的内核能力,包括进程/线程管理、内存管理、文件系统、网络管理和外设管理等。这种设计使得系统能够兼容 Linux 的核心功能和命令。
手机上使用的 鸿蒙OS系统(Harmony OS) = AOSP + EMUI 界面+ HMS服务 +鸿蒙API接口
。
OpenEuler 是一个开源的 Linux 操作系统(Red Hat系列的Linux内核
,其包后缀是.rpm
,最开始是基于 Red Hat Enterprise Linux(RHEL)的 CentOS 分支进行定制
),由华为发起并贡献核心代码,旨在为数据中心、云计算、边缘计算等场景提供高性能、高可靠性和高安全性的操作系统。它由开放原子开源基金会
孵化,目标是构建一个开放、创新的操作系统生态。
微内核
那么微内核是什么呢?
微内核(Microkernel)
是一种操作系统内核架构,其核心思想是将操作系统的核心功能最小化,仅保留最基本的服务,如进程管理、线程调度、内存管理、进程间通信(IPC
)等。其他功能,如文件系统、设备驱动、网络协议等,则作为用户态服务
运行。
LiteOS
LiteOS 是华为开发的一款轻量级实时操作系统(RTOS),专为物联网(IoT)设备和嵌入式系统
设计。
LiteOS 的内核非常小巧,基础内核体积可以裁剪至不到 10KB,适合资源受限的嵌入式设备。
LiteOS 集成了多种物联网通信协议
,如 MQTT、CoAP、LwM2M 等,方便设备与云端的互联互通。
鸿蒙微内核
鸿蒙微内核则在 LiteOS 的基础上进行了增强和扩展,继承了其低功耗和高实时性特点,同时通过微内核架构和分布式能力,支持更广泛的设备和应用场景。
鸿蒙微内核通过模块化设计
,将核心功能精简至最小,提供高效的进程间通信(IPC)
和资源管理能力
。
另一个特点是采用形式化验证方法,增强系统安全性和可信执行环境(TEE)
,降低受攻击几率。
POSIX标准
POSIX就是操作系统接口规范
,POSIX(Portable Operating System Interface for Unix),许多现代操作系统(如 Linux、macOS、FreeBSD
等)都实现了 POSIX 标准,以提高兼容性和可移植性。
POSIX 包括的内容
系统接口:定义了操作系统内核提供的功能,如进程管理、文件系统操作、信号处理、线程管理等。
Shell 和工具:标准化了命令行工具和脚本语言(如 sh、awk、sed 等),确保这些工具在不同系统上具有一致的行为。
实时扩展:支持实时操作系统(RTOS)的特性,如实时线程调度、优先级继承等。
线程支持:定义了线程(pthread)的创建、同步和管理接口,支持多线程编程。
网络接口:标准化了网络编程接口,如套接字(socket)编程。
3.实习干了些什么
主要是对鸿蒙操作系统还有欧拉操作系统进行一些操作系统方面的测试,功能、性能、安全等方面,这会进行个总结。
身份鉴别
这个主要是对登录的用户进行身份标识和鉴别,身份标识有唯一性,身份鉴别信息具有复杂度要求,需要定期更换。
- 查看当前可登录用户,命令
cat /etc/passwd | grep bash
,如下图所示。
cat /etc/passwd
的输出(即 /etc/passwd
文件的内容)会被传递给 grep bash
命令。|
是管道,grep
是一个用于搜索文本内容的命令,可以在文件或输入流中查找匹配指定模式的行。
所以这个命令的作用是:从 /etc/passwd 文件中筛选出所有默认 Shell 为 bash 的用户信息
。
Shell是操作系统中的一个用户界面
,它允许用户与操作系统进行交互。Shell 提供了一个命令行界面(CLI),用户可以通过输入命令来执行各种操作,例如运行程序、管理文件和目录、配置系统等。
大多数 Linux 用户使用 Bash 作为默认 Shell,因此筛选这些用户可以快速找到使用标准 Shell 的账户。某些特定场景下,系统管理员可能需要找到所有使用 Bash 的用户,以便进行脚本管理、安全审计
或其他系统维护任务。
输入命令cat /etc/passwd
可以看到如下的输出。每行对应一个用户,字段之间用冒号(:)分隔。字段的含义如下:
用户名:用户的登录名。
密码:现代系统中通常是一个占位符(如 x),密码信息存储在 /etc/shadow 文件中。
用户 ID(UID):用户的唯一标识符。
组 ID(GID):用户所属的用户组 ID。
用户信息:用户的全名或其他描述信息。
主目录:用户的家目录路径。
默认 Shell:用户登录时使用的 Shell。
root@demo:~# cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
demo:x:1000:1000:demo:/home/demo:/bin/bash
root@demo:~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
- 查看是否有空口令用户:
awk -F : '($2=="")' /etc/shadow
awk
是一个功能强大的文本处理工具,常用于解析和处理结构化的文本文件。它可以根据指定的分隔符将每行文本分割成多个字段,并对这些字段进行操作。
-F
选项用于指定字段分隔符。在这个命令中,字段分隔符是冒号(:)。
/etc/shadow
文件的每一行都包含用户密码信息,字段之间用冒号分隔。
这是 awk 的模式匹配部分,用于指定需要处理的行。$2 表示每行的第二个字段,==“” 表示检查该字段是否为空。
比如输入命令后会得到:
root:$6$abc123$...:18385:0:99999:7:::
daemon:*:18385:0:99999:7:::
nobody:*:18385:0:99999:7:::
testuser::18385:0:99999:7:::
- 查看身份标识唯一性:
cat /etc/passwd | awk -F : '{print $1,$3}' | sort -t ' ' -k 2n | uniq -f1 -D
这个命令的作用是检查系统中是否存在具有相同用户 ID(UID)的用户,即检查用户身份标识(UID)的唯一性。如果存在多个用户共享同一个 UID,则表示身份标识不唯一,这可能是一个配置错误或安全问题。
刚刚我们提到过,/etc/passwd
是一个包含系统用户信息的文件,每一行代表一个用户,字段之间用冒号(:)分隔。其格式如下:
用户名:密码占位符:用户ID(UID):组ID(GID):用户描述:用户主目录:默认Shell
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
user1:x:1000:1000:User One:/home/user1:/bin/bash
user2:x:1001:1001:User Two:/home/user2:/bin/bash
{print $1, $3}
:表示打印每行的第一个字段(用户名)和第三个字段(用户 ID,UID)。
root 0
daemon 1
user1 1000
user2 1001
sort
是一个用于对文本行进行排序的命令。-t ' '
:指定字段分隔符为空格。-k 2n
:表示按照第二列(UID)进行数值排序。
uniq
是一个用于检查和删除重复行的命令。-f1
:表示跳过每行的前一列(即用户名列),只比较第二列(UID)。-D
:表示只显示重复的行。
- 查看密码复杂度策略及相关安全策略:
cat /etc/login.defs
/etc/login.defs
是系统配置文件的路径,用于存储登录和密码相关的全局设置。
比如:
PASS_MIN_DAYS
:指定用户可以更改密码的最小天数。例如,如果设置为 7,用户在 7 天内不能更改密码。
PASS_MAX_DAYS
:指定用户密码的有效期。例如,如果设置为 90,用户必须每 90 天更改一次密码。
PASS_WARN_AGE
:指定在密码过期前多少天开始提醒用户更改密码。例如,如果设置为 7,系统会在密码过期前 7 天开始提醒用户。
LOGIN_RETRIES
:定义用户登录失败的最大尝试次数。
LOGIN_TIMEOUT
:定义登录超时时间(秒)。
CHFN_RESTRICT
:限制用户通过 chfn 命令修改个人信息。
UID_MIN
,普通用户 UID(用户 ID)的最小值,通常为1000。
UID_MAX
,通常是 60000 或 65533。
UMASK
,文件权限相关,新文件和目录的默认权限掩码,通常是 022。设置新创建文件和目录的默认权限。例如,022 表示新文件的默认权限为 644(rw-r–r–),新目录的默认权限为 755(rwxr-xr-x)。
ENCRYPT_METHOD
,密码加密方法,默认值:通常是 SHA512 或 MD5。
设置密码最小长度(PASS_MIN_LEN
)。
- 是否开启sshd服务:
ps -ef | grep ssh
或者service sshd status
检查系统中是否运行了 sshd 服务(SSH 守护进程)。sshd 是 SSH(Secure Shell)服务的守护进程,用于提供安全的远程登录和文件传输功能。
比如下面图中的,sshd: root@pts/0
表示这是一个 sshd 子进程,用于处理 root 用户通过 SSH 连接到终端 pts/0 的会话。
/usr/lib/openssh/sftp-serve
r表示这是一个 SFTP 服务器进程,用于处理通过 SSH 的文件传输请求。
- 检查telnet是否关闭:systemctl status telnet.socket`
如果服务未运行,输出可能显示:
也可以通过命令telnet localhost 23
,使用 telnet 客户端尝试连接到本地主机的端口 23,确认是否可以连接。
访问控制
- 禁止用户远程登录:
cat /etc/ssh/sshd_config | grep PermitRootLogin
减少攻击面:root 用户拥有系统的所有权限,如果攻击者通过远程登录获取了 root 权限,他们将能够完全控制整个系统,包括修改系统配置、安装恶意软件、窃取敏感数据等。禁止 root 远程登录可以有效减少潜在的攻击面。
防止暴力破解:root 是默认的超级用户,其用户名是众所周知的,因此很容易成为暴力破解攻击的目标。攻击者可以尝试使用常见的弱密码或自动化工具来猜测 root 的密码。禁止 root 远程登录可以防止这种攻击。
降低风险:即使使用了强密码,root 用户的远程登录仍然可能被中间人攻击、密钥泄露或其他安全漏洞所利用。禁止 root 远程登录可以降低这些风险。
最小权限原则 是一种安全策略,建议用户和进程仅拥有完成其任务所必需的最小权限。对于远程登录,建议使用普通用户账户登录,然后通过 sudo 或 su 命令获取更高的权限。这样可以限制用户的操作范围,减少误操作或恶意行为对系统的影响。
即使当用户通过 sudo 执行命令时,sudo 会记录执行的用户、执行的命令以及执行时间等信息。这些日志通常保存在 /var/log/auth.log
或 /var/log/secure
文件中。通过这些日志,管理员可以清楚地知道是谁执行了哪些需要 root 权限的操作。如果多个管理员直接以 root 用户登录,很难区分是谁执行了特定的操作,这给审计和责任追踪带来了困难。
可以通过使用 visudo
命令编辑 /etc/sudoers
文件:
# 允许用户 user1 执行所有命令
user1 ALL=(ALL) ALL
# 允许用户组 admin 执行所有命令
%admin ALL=(ALL) ALL
# 允许用户 user2 只能执行特定命令
user2 ALL=(ALL) /usr/bin/apt-get, /usr/bin/reboot
- 查看权限是否合理,批量检查所有用户的 sudo 权限:
getent passwd | cut -d: -f1 | xargs -n 1 sudo -l -U
恶意代码防范
- 查看定时任务配置规则:
cat /etc/crontab
Linux 系统中 /etc/crontab 文件的内容,它定义了系统级的定时任务(cron jobs)
。/etc/crontab 文件用于配置系统范围的定时任务,这些任务通常由系统服务(如 cron 守护进程)
自动执行。
定义了系统级的定时任务,也就是定期执行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly
目录中的脚本。这些任务通常用于系统维护,例如清理临时文件、更新系统日志、备份数据
等。
- 检查定时任务是否运行:
service cron statusb
首先,输出显示 cron.service
是一个名为“Regular background program processing daemon
”(定期后台程序处理守护进程
)的服务。它用于管理定时任务(cron 任务
),这些任务会在指定的时间自动运行。
服务的活动状态为“active (running)
”,表明 cron 服务正在运行。它自 2025 年 3 月 3 日星期一 06:49:53 UTC 开始运行,到目前为止已经运行了 5 小时 48 分钟。
主进程 ID(PID)为 864,表示 cron 服务的主进程
正在运行,并且当前只有一个任务(Tasks: 1)。系统为该服务分配的内存为 2.3M,它属于 system.slice/cron.service 控制组
。
安全审计
- 检查安全审计的守护进程是否正常
:
ps -ef | grep auditd 或者
systemctl status auditd
[kauditd]
表示这是一个内核线程,名为 kauditd,用于处理审计事件。kauditd 是 Linux 审计系统的一部分,负责将审计事件写入日志。
- audit审计规则配置:
cat /etc/audit/audit.rules
删除所有现有的审计规则(-D)。
设置审计事件队列大小为 8192 条目(-b 8192)。
设置失败处理方式为记录失败事件(-f 1)。
设置等待队列的最大等待时间为 0 毫秒(–backlog_wait_time 0)。
- NTP时钟服务是否开启:
systemctl status ntp
检查 NTP(Network Time Protocol)时钟服务是否正在运行。
NTP 的核心功能是同步系统时钟,确保计算机的时间与外部时间源(如时间服务器)保持一致。通过定期与时间服务器通信,NTP 可以校正系统时钟的偏差,从而避免因硬件时钟漂移导致的时间不准确。
在系统管理和安全审计中,准确的时间戳是必不可少的。NTP 可以确保日志文件、事件记录和其他时间敏感信息的时间戳是准确的,从而便于故障排查和安全分析。
入侵防范
- 查看开放端口:
ss -tuln
ss 是 netstat 的现代替代工具,功能更强大,性能更好。
-t:显示 TCP 端口。
-u:显示 UDP 端口。
-l:显示处于监听状态的端口。
-n:以数字形式显示地址和端口。
- State(状态):
LISTEN:端口正在监听,等待连接。
UNCONN:UDP 套接字未连接,UDP 是无连接的协议,所以通常显示为 UNCONN。
- Recv-Q(接收队列):
显示接收队列中的字节数或数据报数。对于监听状态的 TCP 端口,通常为 0,因为它们正在等待连接。
- Send-Q(发送队列):
显示发送队列中的字节数或数据报数。对于监听状态的端口,通常为 0。
- Local Address:Port(本地地址:端口):
显示本地 IP 地址和端口号。可以是 IPv4 地址(如 127.0.0.1)、IPv6 地址(如 [::1]),或者是 0.0.0.0 和 [::] 表示监听所有 IPv4 和 IPv6 地址。
如果地址包含 % 符号,后面跟着的是网络接口名称(如 %lo 表示本地回环接口,%ens33 表示名为 ens33 的网络接口)。
- Peer Address:Port(对端地址:端口):
对于 TCP 监听端口,通常显示为 0.0.0.0:* 或 [::]😗,表示接受任何对端地址和端口的连接。
对于 UDP 端口,通常为空,因为 UDP 是无连接的,没有特定的对端地址。
- Process(进程):
这一列通常显示监听端口的进程信息。但在 ss 命令的输出中,这一列默认是不显示的。如果需要显示进程信息,可以使用 ss -tunp
命令。
在图中,我们可以看到多个 UDP 和 TCP 端口的状态。例如,端口 53 是用于 DNS 的,它在 IPv4 的本地回环地址 127.0.0.53 和 IPv6 的本地回环地址 [::1]:53 上监听。端口 123 是用于 NTP 的,它在多个 IPv6 链接本地地址上监听。端口 8500、22、3306 和 6379 分别是用于一些常见服务的,如 Docker 的 Swarm 模式、SSH、MySQL 数据库和 Redis。
性能压测
通过cat /proc/loadavg
查看系统负载的平均值,其前三列分别表示最近1分钟、5分钟及15分的平均负载。 反映了当前系统的繁忙情况。当平均负载高于 CPU 数量 70% 的时候,你就应该分析排查负载高的问题了。
平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。
CPU 使用率
,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。
比如:CPU 密集型进程
,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
I/O 密集型进程
,等待 I/O 也会导致平均负载升高,但 CPU 使用 率不一定很高。
通过命令stress --vm 2 --vm-bytes 300M --vm-keep
进行系统进行压力测试和性能评估。可以模拟高负载情况,帮助评估系统在极端条件下的表现。
--vm 2
:这个选项指定创建 2 个虚拟内存(VM)工作者(worker),每个工作者会消耗系统资源来模拟负载。
--vm-bytes 300M
:这个选项指定每个虚拟内存工作者分配 300 MB(兆字节)的内存。由于有 2 个虚拟内存工作者,总共会分配 600 MB 的内存。
--vm-kee
p:这个选项指示 stress 在测试结束后保留分配的内存,而不是释放它。通常,stress 在测试完成后会尝试清理和释放资源,但 --vm-keep 选项会阻止这一行为,使内存保持被占用状态。
在执行压力测试时监控系统状态,如 CPU 使用率、内存使用情况、磁盘 I/O 等,以便及时了解系统在高负载下的表现。
检查系统版本
因为鸿蒙欧拉版本比较多,需要核对版本,这个直接输入uname -a
命令即可。
网络测试
使用经典的iperf工具进行tcp和udp测试。
服务端通过命令iperf -u -s
开启udp服务。
然后客户端可以运行下面的命令:
iperf -u -c 192.168.1.1 -b 100M -t 60
表示udp模式下,以100Mbps数据发送速率,测试60s。
iperf -u -c 192.168.1.1 -b 5M -P 30 -t 60
客户端向服务器端发起30个连接线程,以5Mbps为数据发送速率。
iperf -u -c 192.168.1.1 -b 100M -d -t 60
以100M为数据发送速率,进行上下行带宽测试。
对应的TCP模式也是一样的。
服务端通过命令iperf -s
开启tcp服务。
客户端运行命令iperf -c 192.168 .1.1 -t 60
tcp模式下,进行上传带宽测试,测试时间为60s等。
客户端运行命令iperf -c 192.168 .1.1 -P 30 -t 60
tcp模式下,发起30个线程连接测试60s。
常见的linux测试命令
top
实时显示系统中各个进程的资源占用情况,包括CPU、内存、进程ID等信息。
htop
功能类似于 top,但提供了更丰富的交互式界面,支持颜色显示和更多的排序选项。
df -h
显示文件系统的磁盘空间使用情况,-h 参数以易读格式的显示。
ifconfig 或 ip addr
显示网络接口的配置信息,包括IP地址、子网掩码等。
netstat -tuln
显示网络连接、路由表、接口统计等信息。-tuln 参数表示显示TCP、UDP监听端口。
iostat
监控系统输入输出设备和CPU的使用情况。
ps aux
显示系统中所有进程的详细信息,包括进程ID、用户、CPU和内存使用率等。
uptime
显示系统的运行时间、当前时间、负载平均值等。
free -h
显示系统的总内存、已用内存、空闲内存和交换空间(swap)的使用情况。