BSD的内核安全级别

FreeBSD10.0内核源码 FreeBSD 10.0 NET 源码 ,可以直接查看里面的相关函数 立即下载

  bsd 一直是公认的最安全的unix 操作系统,因为它提供了基于内核的安全保护而不仅仅是老式unix 的基于访问控制的安全保护。bsd 为内核划分了安全 等级,这样就可以限制很多不安全的操作,而且bsd 在安全设置上是单点的,使得不可能轻易改变安全级别。linux 提供的lsm“ 可加载安全模块” 可以从 外部加载安全模块,而bsd 将此行为也作为可能的安全隐患,所以bsd 中由内核直接来负责安全,如果内核认为加载的安全模块是不可信的,那么内核将禁止加 载模块,这在bsd 内核中通过安全级别(securelevel )来实现。下面先引用一段介绍安全级别的文字然后我分析bsd 的init 程序中与安全级别 相关的代码:
   FreeBSD
内核有一个安全级别(securelevel )的概念,这是指系统内核运行使用的安全等级,不同的等级具备不同的保护和检查机制。因为这是 内核的检查机制,因此相当严格,没有办法能绕过这个机制提供的保护,因此就对保护FreeBSD 的安全性十分有用。内核的安全级别按照提供安全保护的程度 分为-1 、0 、1 、2 共分为四个级别,安全级别能提供的保护有:
系统文件:系统文件可以设置保护标志" 不可更改" 和 " 只能附加" ,具有这些保护标志的文件在系统的文件属性之外,还受这些保护标志的保护。安全级别可以规定这些标志能否取消。
磁盘设备文件:磁盘设备文件具备两种访问方式,随机访问的方式对应的块设备文件和顺序访问方式对应的字符设备文件,其中字符设备文件可以直接读取硬件设备,因此对于安全至关重要。内核安全级别可以决定是否允许以直接读取硬件的方式操作硬盘设备文件。
直 接内存访问:/dev/mem 和/dev/kmem 是系统内存的映射文件,访问它们就能直接访问系统内存,一些需要获取系统信息和需要进程间共享内存机制 的程序需要访问这两个设备文件以直接访问内存,然而访问内存空间显然也影响系统的安全运行。内核安全级别可以决定是否允许访问系统内存。
安全级别-1 为一种永久性的不安全级别,系统内核不提供任何额外的保护。系统缺省就处于这个级别,此时系统文件的保护标志能被root 用户取消,所有的设备,包括磁盘设备和内存映射设备,均能按照其属性来访问。
  
安全级别0 为不安全的级别,它和等级-1 一样没有对系统提供额外的安全保护,但它影响到内核进程init 的行为。当内核处于级别-1 时,内核init 程序 不会自动更改运行级别,因此一直到进入能够登录的状态,系统安全级别仍然为-1 。这是系统的缺省行为,没有打开安全级别保护机制。但如果安全级别不为 -1 ,init 在进入单用户状态时将改变为0 级别,在进入多用户模式时改变为安全级别 1 。因此安全级别0 为设置了安全级别保护之后,单用户状态下的安全级别。
  
安全级别1 为安全的级别,提供了对系统的保护能力。此时系统文件的那两个保护标志不能被取消,已安装文件系统对应的磁盘设备,以及/dev/mem ,/dev/kmem 不可以用写入模式打开。
  
安全级别2 与级别1 类似,只是进一步增加了对磁盘设备低级操作的限制,不管该磁盘设备是否安装,都不允许直接以写入方式访问,这样就无法进行fdisk 、disklabel 以及newfs 等操作。
  
可以使用sysctl 来查看当前系统的安全级别,但如果没有经过特别设置,FreeBSD 的缺省安全级别应该为-1 :
bash-2.03# sysctl kern.securelevel
kern.securelevel: -1
安 全级别中最重要的一点是,除了内核的init 进程之外,即使是root 用户,也只能不断提高安全级别,没有办法将安全级别降低。这样就基本上保证远程入侵 者在没有重新启动计算机的情况下,无法降低系统运行级别。如果root 想提高系统运行的安全级别,也需要使用sysctl 命令。
bash-2.03# sysctl -w kern.securelevel=0
kern.securelevel: -1 -> 0
安 全级别的意义就在于对文件和设备的保护,如果要对文件提供保护,就需要对文件设置保护标志schg 。设置这个标志需要使用chflags 命令,系统文件如 /kernel ,系统安全的时候就具备这个保护标志。即使在非安全级别下要更改这些文件的时候,也要首先取消保护标志才能进行正常操作。
bash-2.03# mv /kernel /kernel.bak
mv: rename /kernel to /kernel.bak: Operation not permitted
bash-2.03# chflags noschg /kernel
bash-2.03# mv /kernel /kernel.bak
bash-2.03# mv /kernel.bak /kernel
bash-2.03# chflags schg /kernel
上面操作先取消了kernel 文件的不可更改标志schg ,显然这是在非安全级别下的操作。当安全级别处于 1 或2 时,就不能使用chflags 改变文件的保护标志了。
bash-2.03# chflags noschg /kernel
chflags: /kernel: Operation not permitted
可以使用带-o 参数的ls 来查看文件具备的标志。
bash-2.03# ls -lo /kernel
-r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel
因此可以将系统安全相关的很多程序都设置保护标志,这样入侵者就不能轻易更改这些文件了。建议将/bin ,/sbin 下的文件都设置这个标志。
bash-2.03# chflags schg /bin
bash-2.03# chflags schg /bin/*
bash-2.03# chflags schg /sbin
bash-2.03# chflags schg /sbin/*
这里首先将相关目录本身设置保护标志,这样入侵者就不能通过将目录更改名字的方法创造一个新的/sbin 或 /bin 目录。
当 文件具备了保护标志,并且安全级别高于1 时,保护标志就无法取消,这些文件就不能更改,因此就带来一些必要的操作无法进行,例如重新生成内核的操作等。此 时就必须再重新启动系统进入单用户状态执行这些操作。通常情况下,如果FreeBSD 系统只提供网络服务,那么使用安全级别1 或2 毫无问题。然而如果要运 行X Server ,由于X Server 使用了共享内存机制,需要访问/dev/mem 和/dev/kmem ,这样就会带来问题。这时的一种解决办法是在启动X Server 之后(例如使用Xdm ),再升高安全级别,以避开这个问题,但此时 X Server 已经打开了/dev/mem 和/dev/kmem ,安全级别的保护就不再是完美无缺的了(dog250 :攻击者可以利用X 的漏洞实施攻击)。 如果不使用X Server 之类的程序,那么就可以将设置安全级别的命令直接放入系统的启动rc 文件中,以便自动提高安全级别。这需要在rc.conf 文件中设置两个变 量:kern_securelevel_enable 和kern_securelevel 。
kern_securelevel_enable=”YES”
kern_securelevel=0
上面将安全级别设置为0 ,那么在启动之后将自动更改为1 ,这是一种标准的做法。
 
以上就是关于bsd 安全级别的标准描述,那么有句话说只有init 进程可以调整安全级别是什么意思呢?还得通过bsd 的init 源代码来理解,于是翻出bsd 的init.c 文件(前面的文章分析过),里面有一个函数:setsecuritylevel

void setsecuritylevel(int newlevel)

{

#ifdef KERN_SECURELVL  // 在定义安全级别的情况下使能此函数

    int name[2], curlevel;

    extern int errno;

    curlevel = getsecuritylevel();  // 得到当前的安全级别

    if (newlevel == curlevel)       // 已经是当前的级别了,直接返回

        return;

    name[0] = CTL_KERN;

    name[1] = KERN_SECURELVL;

    if (sysctl(name, 2, NULL, NULL, &newlevel, sizeof newlevel) == -1) {  // 一切ok ,无条件设置

        emergency( "cannot change kernel security level from %d to %d: %s", curlevel, newlevel, strerror(errno));

        return;

    }

#ifdef SECURE

    warning("kernel security level changed from %d to %d", curlevel, newlevel);

#endif

#endif

}

下面是getsecuritylevel :

int getsecuritylevel(void)

{

#ifdef KERN_SECURELVL

    int name[2], curlevel;

    size_t len;

    name[0] = CTL_KERN;

    name[1] = KERN_SECURELVL;

    len = sizeof curlevel;

    if (sysctl(name, 2, &curlevel, &len, NULL, 0) == -1) {

        emergency("cannot get kernel security level: %s", strerror(errno));

        return (-1);

    }

    return (curlevel);

#else

    return (-1);

#endif

}

安 全性体现在哪里呢?前面的设置函数可是无条件设置的啊,如果我在我自己的程序里面也来一个sysctl 调用,岂不是也成功了,实际上,sysctl 是个系 统调用,bsd 的实现是在该系统调用的实现里面如果是设置安全级别那么就检查进程的pid ,如果pid 不是1 还想降低安全级别,那么很抱歉,出错返回。见 FreeBSD 的代码:src/sys/kern/kern_mib.c

  mtx_lock(&securelevel_mtx);

  if (!regression_securelevel_nonmonotonic &&

      (level < securelevel) &&          // 新安全级别小于原安全级别

      (req->td->td_proc->p_pid != 1)) { // 设置安全级别的进程不是init 进程

             mtx_unlock(&securelevel_mtx);

             return (EPERM);            // 则出错返回

bsd 的init 不允许重新加载也是通过pid 来判断的,在main 函数里面的第二个大句:

if (getpid() != 1) {  // 这就禁止了init 的重新加载,以不给别的存在不轨意图的人任何机会

    (void)fprintf(stderr, "init: already running/n");

    exit (1);

}

说 bsd 的安全设置是单点的就是上面这个意思,这样不至于最后混乱,那么init 在什么时候调用setsecuritylevel 了呢?通查代码发现在两个 地方调用了setsecuritylevel ,一个就是multi_user ,另一个是single_user 。(如果不明白这两个函数是干甚的,请查阅 我前面的文章《System V 的启动风格和BSD 的启动风格(2)--- 代码角度》)就是进入多用户模式和进入单用户模式的时候进行调用。

state_func_t multi_user(void)

{

...// 前面没有什么语句,仅仅是一些变量的定义。

    if (getsecuritylevel() == 0)  // 如果当前级别为0 ,那么就调整为1

        setsecuritylevel(1);

...

}

state_func_t single_user(void)

{

...// 前面没有什么语句,仅仅是一些变量的定义。

    if (getsecuritylevel() > 0)  // 这个判断说明内核处于安全保护之下,那么进入单用户后将安全级别降为0 ,否则单用户就什么也做不了

        setsecuritylevel(0);

...

}

由 上面的代码可见,安全级别为0 就是一个占位符的作用,提示init 一会一旦进入多用户就将安全级别升为1 ,除此之外它和安全级别-1 没有任何区别。深入到 了init 内部,是不是对安全级别的控制有了一些新的认识呢?init 进程并没有什么神力,只不过是内核将这个单点控制权给了1 号进程而已。

 

YOLO26涨点改进 | 独家主干改进篇 | CVPR 2024 | YOLO26利用InceptionNeXt主干,将大核深度卷积分解为四个并行分支,在提升性能的同时显著降低计算效率 本文聚焦YOLO26的核心涨点改进——基于CVPR 2024收录的InceptionNeXt主干网络,深度拆解了其“大核深度卷积四分支拆解”的核心逻辑,通过实验验证了改进的有效性,同时提供了可快速复现的工程代码与进一步涨点的思路。 阅读详情

相关推荐

从零到一:AIC8800 USB-WiFi模块在Linux内核6.x下的驱动适配与避坑指南

本文详细介绍了AIC8800 USB-WiFi模块在Linux内核6.x下的驱动适配全流程,包括环境准备、源码编译、内核API变更处理及常见问题解决方案。重点针对驱动适配中的符号导出、设备ID识别和固件加载等核心挑战提供实用指南,帮助开发者高效完成硬件驱动兼容性调试。

k8l9m0n的博客 1025

Bsd内核选项总结

Bsd7.2内核选项总结     一: 下面这个选项在每个内核中都要有: machine i386 它指明了机器的硬件体系结构。它必须是i386, pc98, sparc64, alpha, ia64, amd64, 和powerpc当中的一 种。 cpu I486_CPU cpu I586_CPU cpu I686_CPU 二: ident GENERIC ident

ttyttytty12的专栏 1988

wsl2上运行带有Isaac Gym的程序报错: GPU Pipeline: disabled

显示GPU Pipeline:disabled,查找相关文档发现是WSL2目前不支持Isaac Gym,时,想要在wsl2上运行,最后报错如下。

2303_78660611的博客 957

sysctl tip

kern ->核心设置vm   ->虚拟内存vfs   ->文件系统net   ->网络设置debug->调试hw   ->硬件信息user  ->用户信息kern.securelevel安全等级默认为-1可以是-1,0,1,2 可以由底到高的改变net.inet.ip.ttlTTL值默认生存时间为64net.inet.tcp.syncookies  syscookies设置默认为1,既使用syn

tmd_net的专栏 1149

别再手动巡检了!用Zabbix 5.0 + SNMPv2自动监控华为S系列交换机(附完整命令集)

本文详细介绍了如何利用Zabbix 5.0与SNMPv2实现华为S系列交换机的自动化监控,告别低效的手动巡检。通过配置SNMPv2c安全基线、核心功能启用及Zabbix Server端深度配置,构建7×24小时监控体系,实时预警接口状态、流量波动等关键指标,大幅提升运维效率与故障响应速度。

weixin_30940783的博客 628

stm32 + freertos + c++混合编程方法

其他一些资料上面,c++配置成--cpp11或者-cpp 都是把工程配置成c++。三、添加cpp文件,我们调用cpp文件里面的接口函数,不需要修改main.c后缀名。2、配置工程编译时候是--c99,是因为工程里面FreeRTOS是c语言,c++模式会报错。我们这里是默认c,编写的c++文件,单独选择--cpp编译,这在后面配置!c++是面向对象编程,对于一些项目来说,c++编程更加合适!stm32cubemax配置,这里就不写了,配置资料比较多。这里就是让cpp文件在c++下编译。最后,编程成功,点亮!

yuhu0012的博客 2629

2.操作系统——业界成熟内核架构

Linux内核 Linux内核主要有五大组件,系统、进程、内存、储存和网络。没有层次关系,主要依赖函数调用,所以一旦某一个函数出现问题,整个系统都有可能崩溃。这和我们上一讲中宏内核结构是一致的,他的优点是这样的架构性能很高。 Darwin-XNU内核 Darwin是macos与ios操作系统的核心。使用微内核架构。 在内核-用户转换层以下,有两个内核层,Mach层与BSD层 其中Mach内核是卡耐基梅隆大学的经典微内核,提供最基本的操作系统服务。一开始是只有这一个内核。随着性能发展,最基本的内核无法满足

strive for the best 的博客 577

Oracle MCP Server实战:自然语言如何重塑数据库交互体验

本文深入探讨了Oracle MCP Server如何通过自然语言交互技术革新数据库操作体验。作为Oracle数据库的革命性工具,MCP Server集成了先进的Text-to-SQL技术,允许用户使用自然语言直接查询数据库,大幅降低使用门槛。文章详细介绍了从环境搭建、实战案例到企业级部署的全流程,特别强调了中文自然语言处理能力和安全最佳实践,为DBA和开发者提供了从传统SQL到智能交互的转型指南。

u9v0w的博客 283

linux 内核效率 对比bsd,对比平台--Linux与BSD之间的区别

Linux 和 BSD都是免费的开源操作系统,受到Unix操作系统的极大启发。BSD代表伯克利软件发行版。Linux由芬兰学生Linus Torvalds开发。两种Linux的共同点都多于不同点。但是与BSD相比,Linux更为流行和广泛使用。BSD是对在加利福尼亚大学伯克利分校开发的Bell Unix的修改和更新的集合。后来它演变成一个正确的操作系统。Linux有时也称为GNU / Linux,...

weixin_31622725的博客 1052

AD9361 FIR 滤波器设计

matlab 得到滤波器系数

weixin_44630490的博客 1万+

内核工作FAST‘25 Artifact Evaluation流程记录

在我们的paper中,复现需要用到傲腾持久化内存,因此,需要AE Reviewer访问到内网服务器中。我们的思路是购买云服务器,将其作为跳板机,内网服务器通过SSH反向代理与公网服务器建立隧道,AE Reviewer通过隧道访问内网服务器。我们在AE过程中使用。然后,把一切复现需要的代码环境,在chroot里面配置完成。

不定期更新系统使用、编程小技巧,哔哩哔哩账号:https://space.bilibili.com/399455629,欢迎关注 1215

Linux内核调优

Linux内核调优 一、内核参数说明 /proc/sys下内核文件与配置文件sysctl.conf中变量存在着对应关系。 配置说明: 内核参数 参数说明 net.inet.tcp.sendspace=65536 最大的待发送TCP数据缓冲区空间 net.inet.tcp.recvspace=65536 最大的接受TCP缓冲区空间 net.inet.udp.sendspace=65535 最大的接受UDP缓冲区大小 net.inet.udp.maxdgram=65535 最大的发送UDP数据缓冲区大小 net

AnNan1997的博客 1455

SAP CAP core data service 里 association 和 composition 的区别

我们进行 SAP CAP 开发时,在schema.cds里进行数据建模,可以使用 association 和 composition,来描述两个 entity 之间的关联关系。在 SAP BTP 的 Cloud Application Programming Model (CAP) 中,cds文件定义了数据模型,而和是用于建立实体关系的两种关键机制。理解它们的区别对于构建高效、清晰的 CAP 数据模型至关重要。下面,我们将通过严谨的逻辑推理,结合代码示例,深入分析和之间的核心差异。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 322

mysql 梭镖_FreeBSD.6.2服务器架设视频教程下载_服务器教程

教程内容:01安装02配置03ftp04内核05samba06dhcp07mysql08apache何亮bsd教程之apache安装配置何亮bsd教程之apm环境搭建何亮bsd教程之cvsup服务器建立和使用何亮bsd教程之dhcp安装配置何亮bsd教程之ftp安装配置1学习笔记分享:第一项,跳过内核配置文件第二项,配置内核配置文件。TAB切换Q键退出==============标准安装 STAN...

weixin_33272515的博客 98

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

优质干货【内核调优】内核参数说明

/proc/sys下内核文件与配置文件sysctl.conf中变量存在着对应关系。 配置说明: 内核参数 参数说明 net.inet.tcp.sendspace=65536 最大的待发送TCP数据缓冲区空间 net.inet.tcp.recvspace=65536 最大的接受TCP缓冲区空间 net.inet.udp.sendspace=65535 最大的接受UDP缓冲区大小 net.inet.udp.maxdgram=65535 最大的发送UDP数据缓冲区大小 net.local.stream.sends

qq_30566629的博客 775

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

liunx内核优化大全。

一、内核参数说明 /proc/sys下内核文件与配置文件sysctl.conf中变量存在着对应关系。 配置说明:你 内核参数 参数说明 net.inet.tcp.sendspace=65536 最大的待发送TCP数据缓冲区空间 net.inet.tcp.recvspace=65536 最大的接受TCP缓冲区空间 net.inet.udp.sendspace=65535 最大的接受UDP缓冲区大小 net.inet.udp.maxdgram=65535 最大的发送UDP数据缓冲区大小 net.local.st

weixin_54609255的博客 286

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

iOS 系统分析(一) 阅读内核准备知识

原文出自【听云技术博客】:http://blog.tingyun.com/web/article/detail/1134 0x01 iOS体系架构 1.1 iOS 系统的整体体系架构 用户体验( The User Experience layer ):SpringBoard 同时支持 Spotlight。 应用软件开发框架(The Application Framework...

听云APM 362

Linux 系统内核参数调优

通过调试系统内核参数使系统性能最大化如:最大并发数(ab –n 10000 –c 100 http://hosts:port/app/api)sysctl -a 查看所有系统变量-n:打印值时不打印关键字; -e:忽略未知关键字错误; -N:仅打印名称; -w:当改变sysctl设置时使用此项; -p:从配置文件“/etc/sysctl.conf”加载内核参数设置; -a:打印当前所有可用

Men-DD 6552

工作的前奏—关于目录保护与安全级别

单点安全策略单向安全策略是最安全的,安全监测点越多越容易造成漏洞,linux的策略很好,但是如果你将那个所谓的单点给突破了,那么不要试 图补救,如果补救,看似负责任,实际上往往会把问题越搞越乱,单点监控被突破只能说明一个问题,就是这个单点监控点设置的不好,既然出问题了,那就到此为止吧。      linux中的root权限控制就是一个很好的例子,/sbin下的命令都是一般用户所不能使用的,这些

TCP/IP 3193

Linux下sysctl.conf内核参数详解

最近发现很多内核优化参数都记不住了,写下文章来备记,方便以后查看. 编辑 /etc/sysctl.conf 文件,在里面加入如下内容:(有注释) #最大的待发送TCP数据缓冲区空间 net.inet.tcp.sendspace=65536 #最大的接受TCP缓冲区空间 net.inet.tcp.recvspace=65536 #最大的接受UDP缓冲区大小 net.inet.udp.sendspace=65535 #最大的发送UDP数据缓冲区大小 net.inet.udp.maxdgram=65535 #本地

jeevi的博客 1460
上一篇: 从Unix分层内核栈以及中断处理看Linux内核的另类
下一篇: 随想:从down掉系统看操作系统设计
linuxcode_turing
博客等级 码龄17年 0粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值