【转】用capability 特征加强Linux系统安全

用capability 特征加强Linux系统安全

摘要:传统UNIX系统的访问控制模型非常简单——普通用户对超级用户。在这种模型中,一个进程或者帐户要么只有很小的权限,要么具有全部的系统权限。显然,这样对系统的安全没有什么好处。从Linux-2.1内核开始,引入了能力(capability)的概念,实现了更细粒度的访问控制。

   1.简介

   UNIX是一种安全操作系统,它给普通用户尽可能低的权限,而把全部的系统权限赋予一个单一的帐户——root.root帐户用来管理系统、安装软件、管理帐户、运行某些服务、安装/卸载文件系统、管理用户、安装软件等。另外,普通用户的很多操作也需要root权限,这通过setuid实现。

   这种依赖单一帐户执行特权操作的方式加大了系统的面临风险,而需要root权限的程序可能只是为了一个单一的操作,例如:绑定到特权端口、打开一个只有root权限可以访问的文件。某些程序可能有安全漏洞,而如果程序不是以root的权限运行,其存在的漏洞就不可能对系统造成什么威胁。

   从2.1版开始,内核开发人员在Linux内核中加入了能力(capability)的概念。其目标是消除需要执行某些操作的程序对root帐户的依赖。从2.2版本的内核开始,这些代基本可以使用了,虽然还存在一些问题,但是方向是正确的。

   2.Linux内核能力详解

   传统UNIX的信任状模型非常简单,就是“超级用户对普通用户”模型。在这种模型中,一个进程要么什么都能做,要么几乎什么也不能做,这取决于进程的UID.如果一个进程需要执行绑定到私有端口、加载/卸载内核模块以及管理文件系统等操作时,就需要完全的root权限。很显然这样做对系统安全存在很大的威胁。UNIX系统中的SUID问题就是由这种信任状模型造成的。例如,一个普通用户需要使用ping命令。这是一个SUID命令,会以root的权限运行。而实际上这个程序只是需要RAW套接字建立必要ICMP数据包,除此之外的其它root权限对这个程序都是没有必要的。如果程序编写不好,就可能被攻击者利用,获得系统的控制权。

   使用能力(capability)可以减小这种风险。系统管理员为了系统的安全可以剥夺root用户的能力,这样即使root用户也将无法进行某些操作。而这个过程又是不可逆的,也就是说如果一种能力被删除,除非重新启动系统,否则即使root用户也无法重新添加被删除的能力。

   2.1.能力的概念

   Linux内核中使用的能力(capability)概念非常容易被混淆。计算机科学中定义了很多种能力(capability)。能力就是一个进程能够对某个对象进行的操作,它标志对象以及允许在这个对象上进行的操作。文件描述符就是一种能力,你使用open系统调用请求获得读或者写的权限,如果open系统调用成功,系统的内核就会建立一个文件描述符。然后,如果收到读或者写的请求,内核就使用这个文件描述符作为一个数据结构的索引,检索相关的操作是否允许。这是一种检查权限的有效方式,在执行open系统调用是,内核一次性建立必要的数据结构,然后的读写等操作检查只需要在数据结构中梭梭即可。对能力的操作包括:复制能力、进程间的迁移能力、修改一个能力以及撤消一个能力等。修改一个能力类似与把一个可以读写的文件描述符改为只读。目前,各种系统对能力的应用程度并不相同。

   POSIX 1003.1e中也提出了一种能力定义,通常称为POSIX能力(POSIX capabilities),Linux中的定义不大一样。内核使用这些能力分割root的权限,因为传统*NIX系统中root的权限过于强大了。

   2.2.Linux是如何使用POSIX capabilities代替传统的信任状模型的

   每个进程有三个和能力有关的位图:inheritable(I)、permitted(P)和effective(E),对应进程描述符task_struct(include/linux/sched.h)里面的cap_effective, cap_inheritable, cap_permitted.每种能力由一位表示,1表示具有某种能力,0表示没有。当一个进程要进行某个特权操作时,操作系统会检查cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0.例如,如果一个进程要设置系统的时钟,Linux的内核就会检查cap_effective的CAP_SYS_TIME位(第25位)是否有效,

   cap_permitted表示进程能够使用的能力。在cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集。进程放弃没有必要的能力对于提高安全性大有助益。例如,ping只需要CAP_NET_RAW,如果它放弃除这个能力之外的其它能力,即使存在安全缺陷,也不会对系统造成太大的损害。cap_inheritable表示能够被当前进程执行的程序继承的能力。

   3.Linux支持的能力

   Linux实现了7个POSIX 1003.1e规定的能力,还有21个(截止到2.4.7-10版本的内核)Linux所特有的,这些能力在/usr/src/linux/include/linux/capability.h文件中定义。其细节如下:

   能力名 数字 描述CAP_CHOWN 0 允许改变文件的所有权CAP_DAC_OVERRIDE 1 忽略对文件的所有DAC访问限制CAP_DAC_READ_SEARCH 2 忽略所有对读、搜索操作的限制CAP_FOWNER 3 如果文件属于进程的UID,就取消对文件的限制CAP_FSETID 4 允许设置setuid位CAP_KILL 5 允许对不属于自己的进程发送信号CAP_SETGID 6 允许改变组ID CAP_SETUID 7 允许改变用户ID CAP_SETPCAP 8 允许向其它进程转移能力以及删除其它进程的任意能力CAP_LINUX_IMMUTABLE 9 允许修改文件的不可修改(IMMUTABLE)和只添加(APPEND-ONLY)属性CAP_NET_BIND_SERVICE 10 允许绑定到小于1024的端口CAP_NET_BROADCAST 11 允许网络广播和多播访问CAP_NET_ADMIN 12 允许执行网络管理任务:接口、防火墙和路由等,详情请参考/usr/src/linux/include/linux/capability.h文件CAP_NET_RAW 13 允许使用原始(raw)套接字CAP_IPC_LOCK 14 允许锁定共享内存片段CAP_IPC_OWNER 15 忽略IPC所有权检查CAP_SYS_MODULE 16 插入和删除内核模块CAP_SYS_RAWIO 17 允许对ioperm/iopl的访问CAP_SYS_CHROOT 18 允许使用chroot()系统调用CAP_SYS_PTRACE 19 允许跟踪任何进程CAP_SYS_PACCT 20 允许配置进程记帐(process accounting)

   CAP_SYS_ADMIN 21 允许执行系统管理任务:加载/卸载文件系统、设置磁盘配额、开/关交换设备和文件等。详情请参考/usr/src/linux/include/linux/capability.h文件。

   CAP_SYS_BOOT 22 允许重新启动系统CAP_SYS_NICE 23 允许提升优先级,设置其它进程的优先级CAP_SYS_RESOURCE 24 忽略资源限制CAP_SYS_TIME 25 允许改变系统时钟CAP_SYS_TTY_CONFIG 26 允许配置TTY设备CAP_MKNOD 27 允许使用mknod()系统调用CAP_LEASE 28 Allow taking of leases on files

   4.能力边界集

   Linux2.2内核提供了对能力的基本支持。但是在引入了能力之后遇到了一些困难,虽然2.2版本的内核能够理解能力,但是缺乏一个系统和用户之间的接口。除此之外,还存在其它的一些问题。从2.2.11版本开始,这种情况发生了很大的改观,在这个版本中引入了能力边界集(capability bounding set)的概念,解决了和系统和用户之间的接口问题。能力边界集(capability bounding set)是系统中所有进程允许保留的能力。如果在能力边界集中不存在某个能力,那么系统中的所有进程都没有这个能力,即使以超级用户权限执行的进程也一样。

   能力边界集通过sysctl命令导出,用户可以在/proc/sys/kernel/cap-bound中看到系统保留的能力。在默认情况下,能力边界集所有的位都是打开的。

   root用户可以向能力边界集中写入新的值来修改系统保留的能力。但是要注意,root用户能够从能力边界集中删除能力,却不能再恢复被删除的能力,只有init进程能够添加能力。通常,一个能力如果从能力边界集中被删除,只有系统重新启动才能恢复。

   删除系统中多余的能力对提高系统的安全性是很有好处的。假设你有一台重要的服务器,比较担心可加载内核模块的安全性。而你又不想完全禁止在系统中使用可加载内核模块或者一些设备的驱动就是一些内核模块。在这种情况下,最好使系统在启动时加载所有的模块,然后禁止加载/卸载任何内核模块。在Linux系统中,加载/卸载内核模块是由CAP_SYS_MODULE能力控制的。如果把CAP_SYS_MODULE从能力边界集中删除,系统将不再允许加载/卸载任何的内核模块。

   CAP_SYS_MODULE能力的值是16,因此我们使用下面的命令就可以把它从能力边界集中删除:

   echo 0xFFFEFFFF >/proc/sys/kernel/cap-bound

   5.lcap

   虽然我们可以直接修改/proc/sys/kernel/cap-bound来删除系统的某中能力,但是这样毕竟非常的不方便。有一个程序lcap可以帮助我们更方便的从系统中删除指定的能力。它可以从http://home.netcom.com/~spoon/lcap/下载。编译之后就可以直接使用。如果不带参数,lcap可以列出系统当前支持的各种能力:

   [[email protected] lcap-0.0.6]# ./lcap Current capabilities: 0xFFFFFEFF 0) *CAP_CHOWN 1) *CAP_DAC_OVERRIDE 2) *CAP_DAC_READ_SEARCH 3) *CAP_FOWNER 4) *CAP_FSETID 5) *CAP_KILL 6) *CAP_SETGID 7) *CAP_SETUID 8) CAP_SETPCAP 9) *CAP_LINUX_IMMUTABLE 10) *CAP_NET_BIND_SERVICE 11) *CAP_NET_BROADCAST 12) *CAP_NET_ADMIN 13) *CAP_NET_RAW 14) *CAP_IPC_LOCK 15) *CAP_IPC_OWNER 16) *CAP_SYS_MODULE 17) *CAP_SYS_RAWIO 18) *CAP_SYS_CHROOT 19) *CAP_SYS_PTRACE 20) *CAP_SYS_PACCT 21) *CAP_SYS_ADMIN 22) *CAP_SYS_BOOT 23) *CAP_SYS_NICE 24) *CAP_SYS_RESOURCE 25) *CAP_SYS_TIME 26) *CAP_SYS_TTY_CONFIG * = Capabilities currently allowed

   如果我们需要删除某个能力,直接把能力名作为参数就可以,例如我们要删除加载/卸载内核模块的能力:

   [[email protected] lcap-0.0.6]# ./lcap CAP_SYS_MODULE [[email protected] lcap-0.0.6]# ./lcap Current capabilities: 0xFFFBFEFF 0) *CAP_CHOWN 1) *CAP_DAC_OVERRIDE 2) *CAP_DAC_READ_SEARCH 3) *CAP_FOWNER 4) *CAP_FSETID 5) *CAP_KILL 6) *CAP_SETGID 7) *CAP_SETUID 8) CAP_SETPCAP 9) *CAP_LINUX_IMMUTABLE 10) *CAP_NET_BIND_SERVICE 11) *CAP_NET_BROADCAST 12) *CAP_NET_ADMIN 13) *CAP_NET_RAW 14) *CAP_IPC_LOCK 15) *CAP_IPC_OWNER 16) CAP_SYS_MODULE 17) *CAP_SYS_RAWIO 18) *CAP_SYS_CHROOT 19) *CAP_SYS_PTRACE 20) *CAP_SYS_PACCT 21) *CAP_SYS_ADMIN 22) *CAP_SYS_BOOT 23) *CAP_SYS_NICE 24) *CAP_SYS_RESOURCE 25) *CAP_SYS_TIME 26) *CAP_SYS_TTY_CONFIG * = Capabilities currently allowed

   6.能力边界集的安全问题

   能力边界集为系统和管理员之间提供了一个便利的交互接口,但是它存在一些的脆弱性。Patrick Reynolds在提交到BugTraq的一个邮件里详细分析了这种脆弱性。对能力边界集的最大威胁就是能够被读/写的/dev/mem设备。在内核内存区中,/proc/sys/kernel/cap-bound直接影射到cap_bset变量中。如果/dev/mem可以写,攻击者就能够直接修改内存重置cap_bset变量。从而能够越过能力边界集打开所有的能力。使用以下命令就可以获得cap_bset变量的地址:

   $ grep cap_bset System.map c01f0cd5 ? __kstrtab_cap_bset c01f7340 ? __ksymtab_cap_bset c01fb2ac D cap_bset

   从结果可以看出,cap_bset位于c01fb2ac.攻击者获得了/dev/mem的写权限,只要写入0xffffffff就能够重新打开所有的能力。

   因此,为了维护能力边界集的安全,你应该放弃系统的CAP_SYS_RAWIO能力。这样会造成X系统和其它一些需要访问/dev/mem或I/O端口的程序无法运行,不过对于服务器来说,这是值得的。除了关闭CAP_SYS_RAWIO,还应该放弃CAP_SYS_MODULE能力。

   7.局限

   虽然利用能力可已经以有效地保护系统的安全,但是由于文件系统的制约,Linux的能力控制还不是很完善。我们除了可以使用lcap从总体上放弃一些能力之外,服务器软件程序员也应该主动放弃进程的一些多余的能力。例如,xntpd程序可以通过以下的步骤放弃没有必要的能力,以加强安全性:

   以完整的root权限启动绑定到ntp端口除了CAP_SYS_TIME能力之外,放弃其它的能力放弃root权限以普通管理帐户的身份进行正常的操作

   但是,并不是所有的程序员能够注意到这个问题,如果能够直接使用chmod和chattr命令限制程序的能力将给为方便。例如:

   [[email protected] /root]# chattr +CAP_BIND xntpd

   目前,由于文件系统的制约,还无法实现。

   8.结论

   在本文,我们讨论了Linux的能力,并说明了如何使用相关的工具加强系统的安全性。但是,能力还守制于文件系统的扩展,并不是非常完善。

【转】用capability 特征加强Linux系统安全

时间: 2024-10-08 07:40:04

【转】用capability 特征加强Linux系统安全的相关文章

linux系统配置文件

1./etc/sysconfig/i18n(语言配置文件). LANG="zh_CN.UTF-8"              #中文 LANG="en_US.UTF-8"或LANG=""     #英文 2./etc/sysconfig/network-scripts/ifcfg-eth0(eth0配置文件) 静态: DEVICE=eth0 #网卡接口名称 HWADDR=00:0C:29:13:5D:74 #网卡设备MAC地址 TYPE=Ethe

Linux系统用户与组的基本命令

用户和组的管理主要是出于对人员的管理,在多用户多任务分时操作系统中:所有一个要使用系统资源的用户都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面能帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问:另一方面也能帮助用户组织文件,并为用户提供安全性保护.每个用户账号都拥有一个惟一的用户名和用户密码.用户在登录时键入正确的用户名和密码后,才能进入系统和自己的主目录.用户和组的管理就是要对员工的账号进行不同程度的管理,一个用户属于什么组对应的使用这个组所

linux系统下,11款常见远程桌面控制软件

linux系统下,11款常见远程桌面控制软件 一. Grdc 它是一个用GTK+编写的,适用于gnome桌面环境的远程桌面访问软件.看图: 常见功能: 1.提供全屏,窗口化的远程控制.支持高分辨率下的窗口显示以及调整. 2.可浮动的工具栏 3.可抓取键盘 4.支持建立一个“常用访问列表” 5.连接快速,高效 6.全屏模式下,当鼠标划过屏幕边缘时自动滚动 7.全屏模式下工具栏同样支持浮动效果,可直接进行例如模式切换,键盘抓取最小化等常见操作. 8. rdesktop 支持RDP协议, 9. 支持

使用 ipmitool 实现 Linux 系统下对服务器的 ipmi 管理

http://www.ibm.com/developerworks/cn/linux/l-ipmi/ 1.简介 IPMI(Intelligent Platform Management Interface)即智能平台管理接口是使硬件管理具备“智能化”的新一代通用接口标准.用户可以利用 IPMI 监视服务器的物理特征,如温度.电压.电扇工作状态.电源供应以及机箱入侵等.Ipmi 最大的优势在于它是独立于 CPU BIOS 和 OS 的,所以用户无论在开机还是关机的状态下,只要接通电源就可以实现对服

Linux系统开发6 信号

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] <大纲> Linux系统开发6 信号 linux系统有64种信号 signal man文档 终端按键信号 ctrl +c SIGIN ctrl +z SIGTSTP ctrl +\ SIGQUIT 硬件产生信号 浮点数例外信号  访问非法内存 kill()函数 信号与权限 kill()函数的pid 与返回值 信号产生原因 raise() 信号 abort() 信号 alarm() 信号 收到信号的默认操作

《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS

[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE(2.29——3.6)构造一个简单的Linux系统MenuOS SECTION 1 Linux内核源代码简介 1.操作系统的两把宝剑(回顾上一讲) 中断上下文的切换——保存现场&恢复现场 进程上下文的切换 2.Linux内核源代码简介 打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的

安全威胁无孔不入:基于Linux系统的病毒(转)

虽然在Linux里传播的病毒不多,但也是存在一些.我从一些安全网站搜集了一些资料. 1.病毒名称: Linux.Slapper.Worm 类别: 蠕虫 病毒资料: 感染系统:Linux 不受影响系统:Windows 3.x, Windows 95. Windows 98, Windows NT, Windows 2000. Windows XP, Windows Me, Macintosh 病毒传播: port:80, 443. 2002 感染目标:各版本号Linux系统上的Apache Web

第十七天-linux系统定时任务crontab入门讲解

首先先了解下程序和进程的区别: 程序概念: 程序是为了解决一个信息处理任务而预先编制的工作执行方案,是由一串cpu能够执行的基本指令组成的序列,每一条指令规定了计算机进行什么操作(比如加.减.乘.除.判断等)及操作需要的有关数据.例如,从存储器读入一个数送到运算器就是一条指令,从存储器读出一个数并和运算器中原有的数相加也是一条指令.简单的说:我们使用的命令就是程序,QQ程序,听歌的MP3软件,linux系统也是程序. 基本特征:一堆代码,一个文件,一个命令,程序是静态的,放在电脑里还没有被运行.

在Linux系统下安装大于mysql5.5版本的数据库

linux下mysql 5.5的安装方法: 1.安装所需要系统库相关库文件      gcc等开发包,在安装linux系统的时候安装. 2.创建mysql安装目录 # mkdir -p /usr/local/mysql/ 3.创建数据存放目录 # mkdir -p /service/data/ 4.创建用户和用户组与赋予数据存放目录权限 # groupadd mysql # useradd -g mysql mysql # chown mysql:mysql -R /service/data/