Linux ❀ SeLinux-强制访问控制

SeLinux-强制访问控制

selinux是美国国家安全局(NSA)对于强制访问控制的实现,是linux上最杰出的新安全子系统。NSA是在linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。

selinux可以通过增强访问控制用户程序访问的最低权限:

  1. 对内核对象和服务的访问控制
  2. 对进程初始化,继承和程序执行的访问控制
  3. 对文件系统,目录,文件和打开文件描述的访问控制
  4. 对端口,信息和网络接口的访问控制

在linux里面,所有的文件和进程都有一个security context,而selinux就是通过security context来对文件和进程进行控制的。

Selinux级别

  • enforcing: 强制 1
  • permissive: 警告 0
  • disable: 禁用

级别切换

  • 强制<–>禁用:下次启动生效,只能修改配置文件
  • 强制<–>警告:即时生效

SELINUX配置文件
/etc/selinux/config

#查看级别

[root@web ~]# getenforce

#使用图形界面切换级别
//安装policycoreutils-gui
//执行system-config-selinux

#使用命令行切换级别
setenforce 0
setenforce 1

#修改级别
#直接编辑/etc/selinux/config
SELINUX=enforcing
#修改完成后重启才能生效

#查看selinux状态

[root@web ~]# sestatus

#查看selinux值

[root@web ~]# ll -Z

安全值:有_t的就为安全值
#查看context值的变化

[root@web ~]# touch 1
[root@web ~]# cp 1 /tmp
[root@web ~]# ll -Z /tmp

#该文件的context值会随着目录的作用和环境的不同而发生改变,该值会继承上一级目录的context值

#修改context值
chcon -t context值的类型 文件名

[root@web ~]# chcon -t user_tmp_t 1

#改变目录的值需要加上-R选项,表示递归
chcon -t context值 directory -R

#恢复一个文件的context值
restorecon -v filename

[root@web ~]# restorecon -v 1

#查看进程的context值

[root@web ~]# ps -Z
aux

查看所有端口的安全值semanage port -l
semanage port -a -t http_port_t -p tcp 6666
向tcp协议添加6666端口

图形化界面修改selinux,先安装policycoreutils-gui,输入system-config-selinux

getsebool -a查看系统中所有的布尔值
setsebool -P ftp_home_dir(-P表示永久生效)
setsebool -P ftp_home_dir=on
setsebool -P ftp_home_dir 1

案例一:
使用httpd服务演示context值得设定
如下:

#确保防火墙开启

[root@web ~]# systemctl status firewalld

#确保SELINUX开启

[root@web ~]# getenforce

#创建web服务内容目录

[root@web ~]# mkdir -p /www/80
[root@web ~]# echo 'welcome to 80!!!' > /www/80/index.html

#修改主服务配置文件以下选项:

[root@web ~]# vi /etc/httpd/conf/httpd.conf
ServerName 192.168.40.131:80

#添加虚拟主机配置文件,并按如下进行配置

[root@web ~]# vi /etc/httpd/conf.d/vhosts.conf

<Directory "/www">
    AllowOverride None
    Require all granted
</Directory>

<VirtualHost 192.168.40.131:80>
    DocumentRoot "/www/80"
</VirtualHost>

#如果在重启服务时,日志提示DNS解析失败时,按如下办法解决:

[root@web ~]# vi /etc/hosts
192.168.40.131 web

#如果有布尔值的提示,请输入以下命令进行处理

[root@web ~]# setsebool -P httpd_can_network_relay 1

#查看端口状态

[root@web ~]# lsof -i:80
[root@web ~]# netstat -lntp | grep 80

#在防火墙中添加web服务的放行规则

[root@web ~]# firewall-cmd --permanent --add-service=http
[root@web ~]# firewall-cmd --reload

#通过浏览器进行访问,发现只能访问默认页,无法访问我们自定义的页面
#这时需要修改自定义目录的context值,如下:

[root@web ~]# chcon -t httpd_sys_content_t /www/ -R

#无需重启http服务,即可通过浏览器进行正常访问

案例二:
使用web服务端口的改变来演示端口的设定
如下:

#创建一个8080端口的web服务目录和默认页面

[root@web ~]# mkdir -p /www/8080
[root@web ~]# echo 'welcome to 8080!!!' > /www/8080/index.html

#在上个案例的页面中添加如下内容:

LISTEN 8080

<VirtualHost 192.168.40.131:8080>
    DocumentRoot "/www/8080"
</VirtualHost>

#保存退出后,重启服务。

[root@web ~]# systemctl restart httpd

#查看端口状态

lsof -i:8080
netstat -lntp | grep 8080

#然后通过浏览器查看该web页面是否能正常访问

#正常情况下,应该无法访问,首先,我们在防火墙添加允许该端口的策略

[root@web ~]# firewall-cmd --permanent --add-port=8080/tcp
[root@web ~]# firewall-cmd --reload

#添加该自定义端口为服务端口

[root@web ~]# semanage port -a -t http_port_t -p tcp 8888

#再通过浏览器进行查看该web服务,即可正常查看

布尔值

#查看布尔值

[root@web ~]# getsebool -a

#查看ftp相关的布尔值

[root@web ~]# getsebool -a | grep ftp

#设置布尔值

setsebool -P ftp_home_dir on

案例三:
使用ftp服务演示布尔值的设定

开启vsftp服务,配置为本地用户允许读写家目录,不允许遍历其他目录
配置如下:

#添加防火墙允许策略

[root@web ~]# firewall-cmd --permanent --add-service=ftp
[root@web ~]# firewall-cmd --reload

[禁止匿名用户]

anonymous_enable=no

[禁止遍历]

#首先开启chroot选项

allow_writeable_chroot=YES

#打开chroot选项

chroot_list_enable=YES

#指定打开谁的CHROOT

chroot_list_file=/etc/vsftpd/chroot_list

#确保以下选项参数无误

local_enable=YES
write_enable=YES

#修改布尔值打开/home目录的权限

[root@localhost haha]# getsebool -a | grep ftp_home_dir
ftp_home_dir --> off
[root@localhost haha]# setsebool -P ftp_home_dir on

linux的访问控制:

-----iptables-------tcp wrappers-------selinux------服务本身的访问控制。
iptables:基于源IP,目的IP,源端口,目的端口来进行控制

TCP wrappers:对服务的本身来进行控制。

	/etc/hosts.allow
	/etc/hosts.deny

sshd(后台服务名称) : ip地址(不允许哪个ip地址访问)

	sshd : 172.16.40.0/255.255.255.0 EXCEPT 172.16.40.1(只允许172.16.40.1访问)

service:对行为做控制,更细致的控制

telnet服务由于密码传送的时候是明文,容易被抓包软件截取到,不能保证安全,现在已被ssh替代。
ftp可以用sftp来取代。
rcp远端复制文件或目录,scp取代了它
rsh由于无法保证安全,可以采用证书验证登录。

1.数据加密:
不对称加密
数据加密 基于公钥与私钥组 成对出现,一组密钥。
原理:先由收信人生成一对公钥与私钥;收信人将公钥发布出去,留下私钥;送信人获取公钥,然后用公钥将传送给收信人的信息加密;收信人收到加密信息后再用私钥将信息解密。
2.数字签名
另一种同样基于公钥与私钥组的不对称加密
原理:发信人先生成一对公钥与私钥;发信人将公钥发布出去,留下私钥;发信人用私钥将所传送的信息加密,然后送出;收信人用获得的公钥将信息解密。
PKI与证书服务应用
PKI(Public Key Infrastructure)即“公钥基础设施”,是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必须的密钥和证书管理体系。简单来说,PKI就是利用公钥理论和技术建立的提供安全服务的基础设施。
基于PKI技术的协议:SSL协议,https使用ssl来实现安全的通信,IPsec(目前最流行的VPN解决方案)

实验:两台主机建立ssh信任,从此,A机器登录B机器就不需要验证了。
A机器:192.168.1.1
B机器:192.168.1.2
ssh-keygen -t rsa生成证书
默认
回车
回车
cd .ssh
ll
scp /root/.ssh/id_rsa.pub root@B机器ip地址:/root/.ssh/authorized_keys
在A机器上登录B机器,不用输入密码

如果B机器登录A机器不需要验证,需要进行类似的操作。
再用scp传输文件的时候,虽然不用输入密码,但是是安全的。

配置ssh服务端,需要安装openssh-server(默认已安装)

设置使用2222端口登录ssh

vim /etc/ssh/sshd_config
	默认端口为22,可修改
setenforce 1
semanage port -a -t ssh_port_t -p tcp 2222
systemctl restart sshd
lsof -i:22查看22端口是否被监听
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload

设置root用户不能ssh远程登录:

vim /etc/ssh/sshd.config
	将PermitRootLogin=yes修改为no
systemctl restart sshd

测试使用root登录,登不上
测试普通用户,可以登录

设置指定用户可以登录:

vim /etc/ssh/sshd.config
	AllowUsers xixi
systemctl restart sshd

使用xixi登录,可以登上,其它用户不行

.bash_history文件不记录历史命令:
在/root/.bash_profile文件里面添加以下内容

	HISTSIZE=0
退出重新登录,这样设置后,向上向下箭头就不再显示曾经输入的命令

记录命令执行的时间

vim /etc/bashrc
	添加HISTFILESIZE=2000
	HISTSIZE=2000
	HISTTIMEFORMAT="%Y%m%d-%H%M%S:"格式
	export HISTTIMEFORMATHISTTIMEFORMAT转换为环境变量,之前是用户变量
source /etc/bashrc
history

创作者:Eric· Charles

你可能感兴趣的:(Linux)