SELinux——Secure Enhanced Linux(安全加强的Linux),工作于Linux内核中。
SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。采用委任式存取控制,是在进行程序、文件等细节权限设置依据的一个核心模块。SELinux开启时会为系统中开启的每一个程序和每一个文件加载一个标签,特定标签的程序只能读取或者操作特定标签的文件,如果标签不配套,该访问就会被禁止,这种在文件上的标签被称为 安全上下文,在程序上的标签为sebool值
常见的两种访问控制:
DAC:自主访问控制(Discretionary Access Control,DAC)是这样的一种控制方式,由客体的属主对自己的客体进行管理,由属主自己决定是否将自己的客体访问权或部分访问权授予其他主体,这种控制方式是自主的。
MAC:强制访问控制(Mandatory Access Control,MAC)指一种由操作系统约束的访问控制,目标是限制主体或发起者访问或对对象或目标执行某种操作的能力,每当主体尝试访问对象时,都会由操作系统内核强制施行授权规则——检查安全属性并决定是否可进行访问。任何主体对任何对象的任何操作都将根据一组授权规则(也称策略)进行测试,决定操作是否允许。SELinux采取这种方式。
linux中的权限控制,一个进程能够访问的资源是运行这个进程的用户的权限所决定的,如果想限定这个进程,不管是哪个用户,都只能访问有限的几个资源,则linux自身完成不了,这就需要selinux。
启动与关闭SELinux,在启动菜单(针对grub)的kernel命令行最后添加selinux=0或selinux=1即可。
也可在selinux配置文件中配置。
sandbox:沙箱
SELinux就类似sandbox机制,任何一个进程都启动在一个sandbox中,即使进程被劫持,其所能访问的资源也限定在沙箱中。
SELinux有两种工作级别:
strict:每个进程都受到selinux的控制;
targeted:仅有限个进程受到selinux控制;只监控容易被入侵的进程;
SELinux组成主要组成部分为Subject、Object、Policy和security context
Subject即是要管理的程序,Object即是要操作的文件系统,Policy为基本的存取安全性策略,分别为:
targeted:针对网络服务限制较多,针对本机限制较少,是默认的政策;
minimum:由target修改而来,仅针对选择的程序来保护;
mls:完整的权限限制,限制方面较为严格;
Subject与Object的security context要一致才能顺序存取,其分为3个部分:
Identity:unconfined_u 表示文件来自不受限程序产生,system_u 表示文件由系统产生;
Role:object_r 表示文件,system_r 表示程序或一般使用者,unconfined_r 表示不受限角色;
Type:在Subject则称为domain,在Object中称为Type,两者需一致;
可以用主谓宾的形式表达:subject operation object
subject:进程
object:进程,文件
文件:open,read,write,close,chown,chmod
subject:domain
object:type
SELinux为每个文件提供了安全标签,也为进程提供了安全标签;
user:role:type:
user:SELinux的user
role:角色
type:类型
SELinux规则库:(为加快速度,被编译成二进制)
规则:哪种域能访问哪种或哪些种类型内文件;getsebool -a
一个进程中可能有多种功能,这些不同功能也会为进程引入风险,selinux也对这种情况进行控制,属于布尔型特性。使用getsebool -a可以获取:
配置SELinux:
SELinux是否启用;
给文件重新打标;
设定某些布尔型特性;
SELinux的状态:
enforcing:强制,每个受限的进程都必然受限;
permissive:启用,每个受限的进程违规操作不会被禁止,但会被记录于审计日志;
disabled:关闭;
selinux的配置文件: /etc/sysconfig/selinux 或/etc/selinux/config
状态 | 含义 |
---|---|
SELINUX=enforcing | selinux开启,级别为强制 |
SELINUX=permissive | selinux开启,级别为警告 |
SELINUX=disable | selinux关闭 |
相关命令:
getenforce:获取selinux当前状态
setenforce 0|1: 0位permissive,1为enforcing,此设置重启系统后无效
配置文件:/etc/sysconfig/selinux,/etc/selinux/config
SELINUX={disabled | enforcing | permissive}
给文件重新打标:
chcon:
chcon [OPTION]... CONTEXT FILE...
chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
chcon [OPTION]... --reference=RFILE FILE...
-R:递归打标;
不同目录下,创建文件标签是不同的:
修改类型:
还原文件的默认标签:
restorecon [-R] /path/to/somewhere
布尔型规则:
getsebool:getsebool [-a] [boolean]
setsebool:setsebool [ -P] boolean value | bool1=val1 bool2=val2 ...
-P将规则保存到规则库中
semanage:用于管理SELinux的策略
bash脚本编程:
顺序执行
选择执行
条件测试
运行命令或[[ EXPRESSION ]]
执行状态返回值;
if
case
循环执行
将某代码段重复运行多次;
重复运行多少次?
循环次数事先已知;
循环次数事先未知;
必须有进入条件和退出条件;
for,while,until
函数:结构化编程及代码重用; function
for循环语法:
for NAME in LIST;do
循环体
done
列表生成方式:
(1)整数列表:{start .. end}、$(seq start [[step] end])
(2)glob : /etc/rc.d/rc3.d/K*
(3)命令:
通过ping命令探测192.168.1.1-192.168.1.254,显示活跃的主机及活跃和不活跃主机数
#!/bin/bash
#
net='192.168.1' #定义网络号
uphosts=0 #活动主机数
downhosts=0 #不活动主机数
for i in {1..254};do
ping -c 1 -w 1 ${net}.${i} &> /dev/null
if [ $? -eq 0 ]; then
echo "${net}.${i} us up."
let uphosts++
fi
done
downhosts=$((254 - uphosts))
echo "Up hosts: $uphosts."
echo "Down host: $downhosts."
while循环:
while CONDITION; do
循环体
done
CONDITION:循环控制条件,进入循环之前,先做一次判断,每一次循环之后会再次做判断;
条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环;
因此:CONDITION一般应该有循环控制变量,而此变量的值会在循环体不断的被修改。
示例:求100以内所有正整数之和:
#!/bin/bash
#
declare -i sum=0
declare -i i=1
while [ $i -le 100 ]; do
let sum+=$i
let i++
done
echo "$i"
echo "sum:$sum"
示例:添加10个用户:
#!/bin/bash
#
declare -i i=1
declare -i users=0
while [ $i -le 10 ];do
if ! id user$i &> /dev/null; then
useradd user$i
echo "new user:user$i added!"
let users++
fi
let i++
done
echo "Add $users users."
ping探测,使用while语句:
#!/bin/bash
#
declare -i i=1
declare -i uphosts=0
declare -i downhosts=0
net='192.168.1'
while [ $i -le 50 ]; do
if ping -c 1 -w 1 $net.$i &> /dev/null; then
echo "$net.$i is up."
let uphosts++
else
echo "$net.$i is down."
let downhosts++
fi
let i++
done
echo "Up hosts: $uphosts"
echo "down hosts: $downhosts"
打印乘法表:
#!/bin/bash
#
for j in {1..9}; do
for i in $(seq 1 $j); do
echo -n "${i}X${j}=$[$i*$j] " #内层循环不换行,使用-n选项
done
echo #内层循环完毕,换行一次
done
有不对齐的问题,使用tab键:
#!/bin/bash
#
for j in {1..9}; do
for i in $(seq 1 $j); do
echo -e -n "${i}X${j}=$[$i*$j]\t" #内层循环不换行,使用-n选项,-e选项,允许对反斜线转义的字符进行解释.
done
echo #内层循环完毕,换行一次
done
使用while语句实现乘法表:
#!/bin/bash
#
declare -i i=1
declare -i j=1
while [ $j -le 9 ]; do
while [ $i -le $j ]; do
echo -e -n "${i}X${j}=$[$i*$j]\t"
let i++
done
echo
let i=1
let j++
done