我大约是在2012年左右时,在网络和私有云两大领域之外,又在操作系统领域得到一个非常有挑战的新机遇:为公司超过30万台的服务器提供安全的Linux操作系统解决方案,并为操作系统领域提供24x7应急响应和支持服务(Tier 3 Escalation)。我得到Linux社区一些朋友的帮助,在较短的时间内快速成立了一个研发团队,其中一位技术大拿是看到我们这个领域的大牛左耳朵耗子转发贴子后和我取得联系并加入的。我们最终在Linux领域交付的产品,内部的名字叫“APOL Image” (基于Oracle Linux 和Oracle VM Server),以及相关用于操作系统安全评估、修复和强化的工具集。这个解决方案不仅应用企业内部的部署,还应用于公有云和一些特别需求的外部客户,包括XX联邦政府。在2018年,团队成员在美国旧金山的Oracle OpenWorld 2018上发表了主题为“Perform In-Place Upgrade for Large-Scale Cloud Infrastructure”的演讲,将部分经验分享了出来。
本文就已经公开的部分信息,简要地概述一下我们是如何提供安全的Linux操作系统解决方案的。
1
最小化安装
(一)决定最小化安装包清单的基本原则
我们的解决方案是基于Oracle Linux(OL,以前称为Oracle Enterprise Linux),是由Oracle自行分发的Linux发行版,自2006年底以来部分由GNU通用公共许可证提供。它是从Red Hat Enterprise Linux(RHEL)源代码编译而来,用Oracle代替Red Hat品牌。它有很多针对Oracle产品的加强和Bug Fix,也被Oracle云和Oracle集成系统(如Oracle Exadata等)使用。
在安装Oracle Linux的系统上,我们建议删除不需要的RPM,以最小化软件占用空间。那么,我是如何确定这个最小化清单呢?
最小化清单包括如下几点:
(1)基础包 (@core Yum groups),以及其依赖的软件包。
(2)Oracle UEK 内核 (kernel-uek,kernel-uek-firmware,kernel-uek-devel)。
(3)安装RDBMS数据库所依赖的软件包 (oracle-rdbms-server-12cR1-preinstall etc., 但是不包括RDBMS数据库或preinstall本身)
(4)JVM 或 Oracle Java JDK 所依赖的软件包(不包括JVM/JDK本身)
(5)VNC Server (tigervnc-server or vnc-server) 所依赖的软件包(不包括tigervnc-server/vnc-server本身,也不包括X WINDOWS)
(6)一些通用的基础软件包,例如 audit.x86_64, authconfig.x86_64等等。
(8)运维所需要的额外的软件包,包括安全工具(比如setools)、我们自己定制的性能数据收集软件包(Oracle OSWatcher)、硬件管理数据包(oracle-hmp-tools.x86_64, MegaCli.noarch,smartmontools.x86_64, lldpd.x86_64)。
(二)对每个OL版本,使用CHROOT来生成原始的最小化软件包清单
我们使用CHROOT测试并生成每个OL版本的最小化包列表的初始版本。其中,首先要安装oraclelinux-release软件包。 在release安装正确后,我们可以运行yum,使用“--installroot”选项在chroot目录中安装其他软件包了。
以下是生成包列表的示例过程。
CHROOT=./CHROOT
CDROM=./CDROM
YUM_REPO_FILE=yum_repo.repo
mkdir -p ${CDROM}
mount -o loop,ro $ISO_FILE ${CDROM}
cat > $YUM_REPO_FILE <
[main]
include=/etc/yum.conf
plugins=1
group_package_types=mandatory
[rpm_footprint_dvd]
name=rpm_footprint_dvd
baseurl=file://${CDROM}/Server
gpgkey=file://${CDROM}/RPM-GPG-KEY
gpgcheck=0
enabled=1
[rpm_footprint_addons]
name=rpm_footprint_addons
...skip....
[rpm_footprint_uek]
name=rpm_footprint_uek
...skip....
EOF!
mkdir -p ${CHROOT}
mkdir -p ${CHROOT}/var/lib/rpm
rpm --rebuilddb --root=${CHROOT}
yumdownloader -c $YUM_REPO_FILE --disablerepo=* --enablerepo=rpm_footprint* --installroot=${CHROOT} oraclelinux-release
rpm --root=${CHROOT} -ivh --nodeps $LINUX_RELEASE
yum -c $YUM_REPO_FILE --disablerepo=* --enablerepo=rpm_footprint* --installroot=${CHROOT} groupinstall -y "Core"
rpm --root=${CHROOT} -ivh --nodeps $KERNEL_UEK
# Install DB and Java, and Others
yum -c $YUM_REPO_FILE --disablerepo=* --enablerepo=rpm_footprint* --installroot=${CHROOT} install -y $PKG
# Remove the Java JDK and RDBMS preinstall packages
yum -c $YUM_REPO_FILE --disablerepo=* --enablerepo=rpm_footprint* --installroot=${CHROOT} erase -y $PKG
# Get the rpm list
rpm --root=${CHROOT} -qa --qf '%{n}-%{v}-%{r}.%{arch}.rpm\n' |sort > rpm-list.txt
(三)审核最小化软件包清单
审核每个软件包的来源、功能,以及是否真的必要将其收入用于产生环境的Linux Base Image中。
2
LINUX配置的最佳实践指南
有了软件包清单,接下来是决定相关的配置了。
(一)优化配置
我的团队基于超过30万的服务器的运维状态、以及超过1万条Bug的研究分析,提炼出了一个针对生产环境的Oracle Linux配置最佳实践指南,涉及Oracle Linux, OVM dom0, Xen 和硬件Firmware。我们对待服务器的Outage事件上,采取的策略是:“Fix one fix all”。
这个实践指南是一个持续更新的基于专家知识的文档,为产品、运维和信息安全部门提供充分的Linux配置信息以供审核和反馈。内容包括了NTP客户端配置、SysLog、Cron、Sshd、Ulimit、Banner、审计、SELinux、串行控制台设置、NUMA、Cstate、Xen配置、NFS客户端、Sysctl设置(优化的参数包括了文件系统、网络、错误修复、网络性能、网络安全、虚拟内存、OOM killer调整、vm.nr_hugepages、内核消息、内核Semaphores、共享内存、kernel.sysrq等等)、LDAP客户端、ipmitool和HMP、DNS客户端、Timezone、Mcollective、Puppet客户端、邮件和Sendmail、默认启用的服务、LLDP、OS Watcher、EM和EMAgent、磁盘布局、RAID和LVM、文件系统、网络和Yum等等。
(二)创建特定的user和groups
(三)删除不需要的软件包和服务以进行操作系统安全强化
(四)磁盘空间布局标准化
(五)更新kickstart模版
我们使用kickstart模板来自动构建新版本的Linux系统,所有配置变更都须在kickstart体现出来。另外,我的一位同事写了个很棒的工具,可以将新版本的kickstart模板和老版本的差别自动转化为“零停机时间”的升级程序。
3
安全检查
一个新版本的OS Image准备就绪后,除了常规的功能、性通、整合测试外,我们还需要进行安全测试。
我们的安全检查包括CIS-CAT测试、QualysGuard测试、和我们定制作的OpenSCAP测试。然后根据测试发现的弱点调整安装包和配置,更新kickstart模版。
同时,对于政府的云服务,我们云安全团队通过Nessus Scanner / Nessus安全中心进行每月扫描,并将发现的弱点告诉我们,以便我们即时提供强化修复方案。这也是我们整个安全检查环节中的重要一环。
除了测试,我们每周会定期跟踪新的关键CVE,监测行业安全漏洞相关信息。
4
Agile Scrum 和 CI/CD流程
我们使用Agile Scrum 方式进行Linux Image项目管理, Scrum Sprint 周期为7天。
同时我们使用Jenkins进行整合测试, 使用Jenkins声明性管道的Jenkins文件来简化测试配置,并使用“来自SCM的管道脚本”,以确保所有测试的变更在Git Repo里可跟踪。
5
Linux OS安全评估和强化平台
我们还开发了一个Linux操作系统安全评估和强化平台,用于操作系统安全评估和强化修复。这是一个用于自助服务的应用程序,系统运维部门能够通过对CVE,报告和建议的自动评估来进行Oracle Linux OS安全评估。此外,它还支持STIG的操作系统强化和其他合规性修复任务。无论是否进行自定义,用户都可以运行自动修补和强化修复。同时,它允许轻松地将各种安全扫描工具(OpenScap,NESSUS,CIS-CAT,Pen-test,Yum Security-plugin, DISA STIG等)与其他企业分析或报告系统集成(例如OS Security Web Service,EM,PEO APS Auto-Remediation工具链,aps-cli或PEO Jobcontrol健康检查报告)。
6
以零停机时间为目标的自动部署和升级方案
在涉及到Kernel的升级中,我使用的是ksplice技术来实现“零停机时间”的操作系统升级。
在2018年的Meltdown 和 Spectre 漏洞事件中,我们设计开发并实施了一个内部编排解决方案。在很短的期限内,我们提供了45,000行源代码(不包括评论或空白行),实现了一个dom0 和 domU 全面自动升级的方案,这个方案以Oracle SaaS服务的POD为目标对象,进行在线升级和强化。大约超过 70 万 VM 实例以及相应物理设备使用了我们的这个内部编排方案进行操作系统升级。
Oracle OpenWorld 2018: Perform In-Place Upgrade for Large-Scale Cloud Infrastructure
我们最终在Linux领域交付的产品,是一个内部的名字叫“APOL Image”的Oracle Linux和OVM dom0方案,以及相关用于操作系统安全评估、修复和强化的统一工具链。
本文旨在简单阐述一下作为一个IT系统架构师,我工作中是如何思考并持续改进生产环境中Linux操作系统安全性和可靠性的。其目的在于抛砖引玉,带动大家一起讨论Linux操作系统安全性及改进方案。其中有些观点不一定正确,欢迎批评指正。
欢迎大家发表留言,列出你的企业在Linux操作系统领域遭遇到的痛点问题。
(作者:王录华,Oracle云服务研发总监)
参考资料
(1)、Oracle OpenWorld 2018: Perform In-Place Upgrade for Large-Scale Cloud Infrastructure
(2)、Oracle ksplice: https://www.oracle.com/webfolder/assets/infographics/ksplice/index.htm
(3)、Xen: http://xenbits.xen.org/xsa/
(4)、Oracle:http://linux.oracle.com/pls/apex/f?p=130:21
(5)、https://blogs.oracle.com/security/
(6)、http://www.oracle.com/technetwork/topics/security/whatsnew/index.html
(7)、https://nvd.nist.gov/vuln/search
(8)、CVE details http://www.cvedetails.com/
(9)、Redhat:https://access.redhat.com/security/cve/
(10)、https://rhn.redhat.com/errata/rhel-server-6-errata.html
(11)、https://rhn.redhat.com/errata/rhel-server-errata.html
(12)、https://securityblog.redhat.com/
(13)、 MS-ISAC Cyber Security Advisories - http://msisac.cisecurity.org/advisories/
(14)、 IBM's Alert - http://www.iss.net/threats/ThreatList.php