新时代运维高考题 - About Computers

挺有趣的题目,原文: https://zhuanlan.zhihu.com/p/163623062

本考试为闭卷考试,总分 120 分,考试时间 120 分钟。答题卡必须使用中性笔或黑色墨水的钢笔填写,答在试卷上的答案视为无效。考试期间允许使用游标卡尺。

选择题(10 分)

  1. 在 CentOS 6 默认安装下,以下哪个配置文件不能实现 iptables 开机自动导入配置? A. /etc/sysconfig/iptables B. /etc/rc.local C. /etc/iptables/rules.v4 D. /etc/network/if-up.d/
  2. 在 YAML 中,哪个国家的 ISO 3166 二字母代码必须加引号? A. 智利 B. 挪威 C. 新西兰 D. 特克斯和凯科斯群岛
  3. 以下哪种是 OpenLDAP 支持的 replication 模式? A. CopyMode B. PushMode C. MirrorMode D. PullMode
  4. 阿里云用于控制子用户权限的功能被称为: A. ROM B. RAM C. SSD D. NVME
  5. 在下列哪种 Docker 网络下,容器不能和主机通信? A. host B. bridge C. macvlan D. overlay

填空题(10 分)

  1. Oracle JRE 下用来设置支持的 TLS 协议版本的参数是:( )
  2. 写出任意三种 StrongSwan 在 IKEv2 模式下支持的 cipher suite:( )
  3. 如果要让 Nginx 的访问日志输出格式和 Apache 的默认日志格式一致,log_format 应当设为:( )
  4. HPE 服务器的 Advanced ECC 模式可以检查出单个 DIMM 上的( )bit 内存问题,修复( )bit 内存问题。这个模式下的实际可用内存大小是 Mirrored Memory with Advanced ECC 模式的( )。
  5. Python 可以使用内置的( )或( )库来调用第三方命令。

编程题(30 分)

  1. 编写 Ansible playbook 实现 Ubuntu 20.04 服务器自动加入 Active Directory 域,允许域管理员以 sudo 身份执行任意命令(无需再次输入登录密码),并且域用户可以使用 kerberos 认证方式从 SSH 登录服务器。(10 分)

  2. 你有公司服务器的 root 权限,并且对公司怀恨在心已久,想要在从公司离职之前破坏 CentOS 8 服务器上的数据。请使用 POSIX 兼容的 Shell 脚本写一个小程序,支持以下功能:

  • 开机启动
  • 以任意远程控制方式接收你离职的消息
  • 删除自身和所有自身产生的日志
  • 删除服务器上所有 Docker 容器和卷
  • 扫描全盘,删除服务器上所有 MySQL 数据库和数据库备份文件

(20 分)

简答题(70 分)

  1. 请写出 QEMU 从一个 raw 格式虚拟磁盘文件启动虚拟机的所有方法。(10 分)

  2. 已知服务器上现有一个病毒程序,你使用 ps 和 top 均无法看到此病毒进程。那么接下来你将如何查找该病毒程序的位置?请简述你的思路。(10 分)

  3. 随着网络技术的发展,网络的瓶颈已经逐渐不再是网卡和网线,而是 CPU、内存和基于中断的内核网络协议栈。为了充分利用 100Gbps 以上的高速网络,人类不断开创新技术以绕过这些瓶颈。请在这类技术中任选一个,说明:

    1)它以什么方式绕过了哪些网络传输过程中的瓶颈 2)它的部署成本和带来的性能提升 3)它对计算机系统和网络分别有哪些前提要求(20 分)

  4. 你是一家大型传统行业公司的运维部门领导,公司的主要业务都基于 Java 和 PHP 编写。开发部门的领导准备在公司推广使用 k8s。 1)使用 k8s 对运维部门会带来哪些好处和哪些坏处?(10 分) 2)公司非技术出身的领导团队对 k8s 仍持怀疑态度,从你和对方的专业角度出发,提出强有力的观点来打消对方的疑虑。(20 分)


删除华为云服务器自带的探针

不喜欢服务器上跑着不明的进程,年初入了几个华为云耀云服务器,这一篇记录如何卸载华为云服务器自带的系统探针,系统为Debian 10。

首先我们来看一下服务器有哪些进程:

pstree -a

可以查到与几个不明的进程,

systemd
  |-ModemManager --filter-policy=strict # 控制移动宽带设备和连接,管理上网卡,跑这个,有病?
  |   `-2*[{ModemManager}]
  |-NetworkManager --no-daemon    # 网络配置
  |   |-dhclient -d -q -sf /usr/lib/NetworkManager/nm-dhcp-helper -pf /run/dhclient-eth0.pid -lf...
  |   `-2*[{NetworkManager}]
  |-hostguard       # 目标进程,执行检测任务,全量扫描主机;实时监测主机的安全状态,并将收集的主机信息上报给云端防护中心。
  |   `-hostguard
  |       `-15*[{hostguard}]
  |-irqbalance --foreground  # 优化中断分配(可以卸载),自动迁移中断保持中断的平衡,同时会考虑到省电因素等等。 但是在实时系统中会导致中断自动漂移,对性能造成不稳定因素。
  |   `-{irqbalance}
  |-polkitd --no-debug    # 系统层级权限控制(可以卸载)
  |   `-2*[{polkitd}]
  |-rpcbind -f -w
  |-rsyslogd -n -iNONE
  |   `-3*[{rsyslogd}]
  |-systemd --user
  |   `-(sd-pam)
  |-systemd-journal
  |-systemd-logind
  |-systemd-udevd
  |-wpa_supplicant -u -s -O /run/wpa_supplicant  # 无线网络配置,不能卸载= =,卸载之后会因为无法配置网络而无法启动
  `-wrapper /CloudResetPwdUpdateAgent/bin/../conf/wrapper.confwrapper.syslog.ident=cloudResetPwdUpdateA
      |-java -Dorg.tanukisoftware.wrapper.WrapperSimpleApp.maxStartMainWait=40-Djava.libr
      |   `-14*[{java}]
      `-{wrapper}
     # 改密码的代理agent

整理了需要卸载这个几个组件,以下命令均需要root权限运行:

  • ModemManager

    systemctl |grep Modem
    systemctl stop ModemManager.service
    systemctl disable ModemManager.service
      
    apt-get purge --auto-remove -y modemmanager  
    
  • hostguard

    dpkg -P hostguard
    
  • irqbalance

    apt-get purge --auto-remove -y irqbalance
    
  • polkitd

    systemctl disable polkit.service
    systemctl stop polkit.service
    
  • CloudResetPwdUpdateAgent

    bash /CloudrResetPwdAgent/bin/cloudResetPwdAgent.script remove
    bash /CloudResetPwdUpdateAgent/bin/cloudResetPwdUpdateAgent.script remove
    rm -rf /CloudrResetPwdAgent
    rm -rf /CloudResetPwdUpdateAgent
    

shell 获取域名证书的过期时间

SSL 证书是有过期时间的,以前有介绍过 Let’s Encrypt,Let’s Encrypt 证书过期时间是90天,这篇文章记录我的证书过期时间检测脚本。

首先有一个文件记录域名信息 :

# domain_list.md

blog.kelu.org:443
cdn.kelu.org:443

然后同级目录下读取文件进行监控:

#!/bin/bash
script_dir=$( cd "$( dirname "$0"  )" && pwd )

readFile="${script_dir}/domain_list.md"
grep -v '^#' ${readFile} | while read line;do # 读取存储了需要监测的域名的文件
    domain=$(echo "${line}" | awk -F ':' '{print $1}')
    domain_port=$(echo "${line}" | awk -F ':' '{print $2}')

    # 使用openssl获取域名的证书情况,然后获取其中的到期时间
    END_TIME=$(echo | openssl s_client -servername ${domain}  -connect ${domain}:${domain_port} 2>/dev/null | openssl x509 -noout -dates |grep 'After'| awk -F '=' '{print $2}'| awk -F ' +' '{print $1,$2,$4 }' )
    END_TIME1=$(date +%s -d "$END_TIME") # 将日期转化为时间戳
    NOW_TIME=$(date +%s -d "$(date | awk -F ' +'  '{print $2,$3,$6}')") # 将当前的日期也转化为时间戳

    RST=$(($(($END_TIME1-$NOW_TIME))/(60*60*24))) # 到期时间减去目前时间再转化为天数

    echo "${RST}天 : ${domain}"

    if [ $RST -lt 30 ]; then
      # 一些告警的逻辑。。。
      /usr/bin/kelumail "${domain} 证书即将到期" "剩余${RST}天"
    fi
done

参考资料


curl 自定义域名解析,根据 HTTP 状态码判断网站是否正常

血衫的blog实际上对应着好些个IP,如果直接监控域名,如果某IP挂掉,也不易察觉。以下是我监控的做法,使用自定义域名解析监控:

domain="blog.kelu.org"
port="443"

curl -I -m 10 -o /dev/null -s -w %{http_code} https://$domain --resolve "$domain:$port:10.100.1.1"
  • -I 仅测试HTTP头
  • -m 10 最多查询10s
  • -o /dev/null 屏蔽原有输出信息
  • -s silent 模式,不输出任何东西
  • -w %{http_code} 控制输出
  • –resolve 解析地址

iftop 使用备忘

iftop是类似于top的实时流量监控工具。

界面表示

=>代表发送数据,<= 代表接收数据
TX:发送流量
RX:接收流量
TOTAL:总流量
Cumm:运行iftop到目前时间的总流量
peak:流量峰值
rates:分别表示过去 2s 10s 40s 的平均流量

参数

-i 指定需要检测的网卡, 如果有多个网络接口,则需要注意网络接口的选择,如:# iftop -i eth1
-B 将输出以byte为单位显示网卡流量,默认是bit
-n 将输出的主机信息都通过IP显示,不进行DNS解析 
-N 只显示连接端口号,不显示端口对应的服务名称
-F 显示特定网段的网卡进出流量  如iftop -F 192.168.85.0/24
-h 帮助,显示参数信息
-p 以混杂模式运行iftop,此时iftop可以用作网络嗅探器 ;
-P 显示主机以及端口信息
-m 设置输出界面中最上面的流量刻度最大值,流量刻度分5个大段显示  如:# iftop -m 100M
-f 使用筛选码选择数据包来计数  如iftop -f filter code
-b 不显示流量图形条
-c 指定可选的配置文件   如iftop  -c config file
-t 使用不带ncurses的文本界面,
    以下两个是只和-t一起用的:
    -s num num秒后打印一次文本输出然后退出,-t -s 60组合使用,表示取60秒网络流量输出到终端
    -L num 打印的行数
-f 参数支持tcpdump的语法,可以使用各种过滤条件。

界面参数

P      切换暂停/继续显示
h      在交互界面/状态输出界面之间切换
b      切换是否显示平均流量图形条
B      切换显示2s 10s和40s内的平均流量
T      切换是否显示每个连接的总流量
j/k    向上或向下滚动屏幕显示当前的连接信息
f      编辑筛选码
l      打开iftop输出过滤功能 ,如输入要显示的IP按回车键后屏幕就只显示与这个IP相关的流量信息
L      切换显示流量刻度范围,刻度不同,流量图形条也会不同
q      退出iftop

主机参数

n      使iftop输出结果以IP或主机名的方式显示
s      切换是否显示源主机信息
d      切换是否显示远端目标主机信息
t      切换输出模式,一行或多行

端口显示参数

N      切换显示端口号/端口号对应服务名称
S      切换是否显示本地源主机的端口信息
D      切换是否显示远端目标主机的端口信息
p      切换是否显示端口信息

输出排序参数

1/2/3  通过第一列/第二列/第三列排序
<      根据左边的本地主机名或IP地址进行排序
>      根据远端目标主机的主机名或IP地址进行排序
o      切换是否固定显示当前的连接

命令参考

  1. 启动界面

    iftop -i eth0 -PB -f tcp
    
    • -i 使用网卡eth0
    • -P 显示端口信息
    • -B 显示大B的数据,也就是byte,默认显示小b,bit。
    • -f tcp 过滤只显示tcp数据
  2. 按L,显示流量刻度

  3. 按T,显示总量

  4. 按t,合并发送接收,只显示一行

  5. 按1/2/3,按照 2/10/40s的速度进行排序

  6. 按B,查看最近2s、10s、40s的统计

  7. 按D,不显示远端目标主机的端口信息

  8. 按P,暂停刷新