1 Linux系统安全概述-sudo授权
1.1 Linux第三阶段资深知识整体概述:
常见攻防手段:
- 防范手段整体分两部分
防范手段: 技术和法规(规章制度)社会工程学
技术层面:
系统验证:
1.2 认证方法
[root@yunzu63 Desktop]# system-config-authentication //如果没有此命令,需要安装
[root@yunzu63 ~]# yum -y install authconfig-gtk //安装
打开字符界面:
[root@yunzu63 Desktop]# authconfig-tui
存放用户信息和密码信息:
用户信息:
[root@yunzu63 ~]# ls /etc/passwd*
/etc/passwd /etc/passwd-
密码信息:
[root@yunzu63 ~]# ls /etc/shadow*
/etc/shadow /etc/shadow-
密码:/etc/shadow- 是/etc/shadow 文件备份
查看是否一样:
[root@yunzu63 ~]# diff /etc/shadow /etc/shadow-
[root@yunzu63 ~]# diff /etc/passwd /etc/passwd-
或
[root@yunzu63 ~]# vimdiff /etc/passwd /etc/passwd-
密码加密技术:
RHEL5 使用 MD5 对/etc/shadow中密码加密
RHEL6 使用sha512 对/etc/shadow中密码加密
例:
[root@yunzu63 ~]# grep shadow /root/anaconda-ks.cfg
authconfig --enableshadow --passalgo=sha512
1.3 授权su/sudo权限
例:su 切换用户:
[root@yunzu63 ~]# su - root
1.4 通过sudo 给普通用户授权:
sudo 是在不切换用户的情况下,以其他用户的身份执行一个命令。它能够限制指定用户在指定的主机上运行某些指定的命令。
/etc/sudoers是sudo命令的配置文件
/etc/sudoers 文档格式:
[root@yunzu63 ~]# vim /etc/sudoers
命令格式
用户名或组名 ALL=(以谁的身份运行命令) Commd_Alias运行的命令
注:
如果组:前面加% 。 如: %kill
Commd_Alias运行的命令:注:1命令;2目录(必须以/结尾)最好使用绝对路径;
配置sudo方法:
方法1:visudo
visudo命令概述:
sudo都提供了一个编辑该文件/etc/sudoers的命令:visudo来对该文件/etc/sudoers进行修改。使用visudo命令修改 sudoers配置,因为它会帮你校验文件配置是否正确,如果不正确,在保存退出时就会提示你哪段配置出错的。
方法2:vim直接编辑/etc/sudoers
[root@yunzu63 ~]# vim /etc/sudoers
实例:测试 sudo 命令
1、建立两个普通用户 liv , poppy 添加到组stu
[root@yunzu63 ~]# groupadd stu
[root@yunzu63 ~]# useradd -g stu liv
[root@yunzu63 ~]# useradd -g stu poppy
[root@yunzu63 ~]#passwd liv (补充的命令)
[root@yunzu63 ~]# echo redhat | passwd --stdin liv
[root@yunzu63 ~]# echo redhat | passwd --stdin poppy
//密码是redhat
切换到liv 测试fdisk -l
[root@yunzu63 ~]# su - liv
[liv@yunzu63 ~]$ fdisk -l //提示对以下设备权限不够,无法打开
fdisk: 打不开 /dev/sda: 权限不够
fdisk: 打不开 /dev/sr0: 权限不够
2 让liv具有root用户使用fdisk的权限。
[root@yunzu63 ~]# vim /etc/sudoers #在文件最后添加以下内容:
liv ALL=(root) /sbin/fdisk
(注:使用sudo命令时加上命令的全路径)
保存退出。不需要重启什么服务。
测试:
[liv@yunzu63 ~]$ sudo fdisk -l
例:再添加几个命令行 使liv能执行更多的命令
[root@yunzu63 ~]# visudo #添加以下内容
liv ALL=(root)
/sbin/fdisk,NOPASSWD:/usr/bin/systemctl,/usr/sbin/lsof,/usr/sbin/service,/usr/sbin/ifconfig,/usr/bin/mount
##RHEL 7环境
注:添加上NOPASSWD: 后,NOPASSWD:之:后的命令都不需要输入密码。默认是PASSWD
测试:
[liv@yunzu63 ~]$ sudo fdisk -l #需要输入liv密码
RHEL 7环境下:
[liv@yunzu63 ~]$ systemctl start httpd //需要认证,需要输入root密码才能够启动
[liv@yunzu63 ~]$ sudo systemctl start httpd /使用sudo是可以直接启动了,也不需要输入root用户密码
[liv@yunzu63 ~]$ sudo lsof -i :80
[liv@yunzu63 ~]KaTeX parse error: Expected 'EOF', got '#' at position 26: …/cdrom /opt/ #̲执行不成功 [liv@yunz…sudo mount /dev/cdrom /opt/ #加sudo 就可以执行成功
[liv@yunzu63 ~]$ ls /opt/
[liv@yunzu63 ~]$sudo fdisk -l
总结:
/etc/sudoers中常用的写法如下:
例:一个用户可以执行另一个用户的某些命令
[root@yunzu63 ~]# vim /etc/sudoers
liv ALL=(poppy) /opt/poppy.sh
例2:让stu组中的所有用户,可以执行/sbin目录下的所有命令
%stu ALL=(root) /sbin/
例3: liv用户可以执行任何用户的任何命令。
[root@yunzu63 ~]# vim /etc/sudoers
liv ALL=(ALL) ALL
2 PAM可插入式验证模块
Pluggable(可插拔) Authentication(认证) Modules )。sun公司提出出来的一种机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。
PAM模块和应用程序之间的关系:就你锁和门的关系
锁PAM认证模块
门应用程序
有验证的程序(如login、ssh、vsftpd、samba、apache):
1)使用通用的pam验证模块.
2)程序自写验证功能. 例:apache的验证是自己开发的
如何知道一个程序是否支持pam认证
ldd命令 显示进程运行所依赖的动态连接库的详细信息
例:
[root@yunzu63 Desktop]# ldd /bin/login #/bin/login 命令的相关共享库文件列表
linux-vdso.so.1 => (0x00007ffccfad0000)
libpam.so.0 => /lib64/libpam.so.0 (0x00007f1786dd9000)
libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f1786bd5000)
libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f17869ac000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f1786785000)
libc.so.6 => /lib64/libc.so.6 (0x00007f17863c2000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f17861bd000)
libcap-ng.so.0 => /lib64/libcap-ng.so.0 (0x00007f1785fb7000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f1785d55000)
/lib64/ld-linux-x86-64.so.2 (0x0000562d55f13000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f1785b38000)
例:查看login是否支持pam
[root@yunzu63 Desktop]# ldd /bin/login |grep pam
libpam.so.0 => /lib64/libpam.so.0 (0x00007fe1dc652000)
libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007fe1dc44e000)
可以查看到pam相关的库,说它支持pam认证。
pam模块:每个模块的功能的都是专用的,独特的。
2.1 pam相关配置文件:
1、pam模块位置:
64位 操作系统:
[root@yunzu63 Desktop]# ls /lib64/security/
2、每个pam模块的配置文件:ls /etc/security/
例:查找模块pam_access.so位置及对应的模块配置文件
[root@yunzu63 Desktop]# ls /lib64/security/pam_access.so
/lib64/security/pam_access.so
[root@yunzu63 ~]# ls /etc/security/access.conf
/etc/security/access.conf
3、每个服务加载的pam模块的配置文件位置
ls /etc/pam.d
例:[root@iZ25b6alxstZ ~]# vim /etc/pam.d/sshd #每个服务器的pam配置文件一般以服务名开头
[root@iZ25b6alxstZ ~]# vim /etc/pam.d/sshd
#%PAM-1.0
auth required pam_sepermit.so
auth include password-auth
account required pam_nologin.so
account include password-auth
注释:配置文件格式
验证类型 控制标识 模块
auth include包含 文件
account required需要 root 模块 [参数]
requisite(必要) 模块
optional可选 模块
sufficient(充足)充分 模块
验证类型:
auth 与用户名密码相关的 ,如: 用户密码是否正确 ,用户是否锁定,密码是否锁定。
account 与用户名密码无关的,如:对用户登录的时间做检查,是否过期。是否允许在ttyx上登录。
控制标识:
需要required:表示后面跟的模块的功能是必要条件,必须成功,最后才可能验证成功、 如果不成功,继续往后验证,最后才返回失败。
例:验证用户名和密码时,如果用户名出错,然后继续往后验证,最后才返回失败。 好处: 不让黑客知道自己是用户名错了还是密码。
必要requisite:表示后面跟的模块的功能是必要条件,必须成功,最后才可能验证成功、
如果不成功,马上返回失败,而不继续往后验证。
例:比如判断一个用户是否是root用户,如果不是,直接返回权限不够。
充分sufficient:充分条件,表示如果后面跟的模块的功能成功,则马上返回成功,如果不成功,忽略不计,继续往后验证。
例:权限验证身份是否是root, 如果是root用户,直接执行
可选optional:表示后面跟的模块的功能是可选条件,不影响最后验证结果
包含include:包含后面指定的文件中的相同验证类型的行。
例1:限制普通用户 Kill 不能在tty2上登录。 在字符login程序下运行。 gnome图面不生效。在gnome图形界面下,是另一套认证机制。
生成用户:
[root@yunzu63 ~]# useradd kill
[root@yunzu63 ~]# echo 123456 | passwd --stdin kill
Changing password for user kill.
passwd: all authentication tokens updated successfully
第一步: 让字符界面登录认证程序login加访问控制功能"pam_access模块”
[root@yunzu63 Desktop]# vim /etc/pam.d/login #添加以下红色内容
account required pam_access.so
如图:
第二步:修改pam_access模块的配置文件/etc/security/access.conf:
[root@yunzu63 ~]# ls /lib64/security/pam_access.so #pam_access模块
/lib64/security/pam_access.so
[root@yunzu63 ~]# ls /etc/security/access.conf # pam_access模块配置文件
/etc/security/access.conf
[root@yunzu63 ~]# vim /etc/security/access.conf #一定要顶头写,不要有空格。在最后添加
- : kill : tty2
#禁止kill从tty2上登录。
测试:
ctrl+alt+F2 切换到: tty2上测试
查看日志:
[root@yunzu63 ~]#tail -f /var/log/secure #与验证有关的都是此日志里一定要学会看帮助和日志
May 7 20:14:11 localhost login: pam_access(login:account): access denied for user kaixin' from
tty2’
May 7 20:14:11 localhost login: Permission denied
总结使用pam模块流程
1、配置服务的pam配置文件来调用pam模块A (选一个锁)
2、配置pam模块A的配置文件,实现某个功能 (上锁)
3、测试
3 对称加密-非对称加密方法
3.1加密算法
1)对称加密(一把密钥配) 容易泄露,效率高
2)非对称加密(一对密钥配(公钥用来加密,私钥用来解密)) 更安全,效率低
对称加密算法:
AES 高级加密算法
DES 标准加密算法
3DES 三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法
非对称加密算法:DSA RSA
例1: 演示对称加密:3des算法
[root@yunzu63 Desktop]# yum install openssl
openssl 是一套加密工具包。
[root@yunzu64 ~]# openssl --help #使用方法
[root@yunzu64 ~]#openssl enc --help #查看加密算法
例:加密
[root@yunzu63 Desktop]# openssl enc -e -des3 -a -in /etc/passwd -out /passwd.des3
enter des-ede3-cbc encryption password:123456
Verifying - enter des-ede3-cbc encryption password:123456
参数:
选项: options are
-in input file
-out output file
-e encrypt 加密 ; 后面可以加很多加密算法,如: -des3 加密码算法
-d decrypt 解码
-a/-base64 base64 encode/decode, depending on encryption flag。# base64编码/解码,这取决于加密标志。
注:Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。
查看加密效果。
[root@yunzu63 Desktop]# vim /passwd.des3
查看不使用-a base64编译的效果:
[root@yunzu63 ~]# openssl enc -e -des3 -in /etc/passwd -out /passwd.des3-v2
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
[root@yunzu63 ~]# vim /passwd.des3-v2
解密:
[root@yunzu63 Desktop]# openssl enc -d -des3 -a -in /passwd.des3 -out /root/passwd
-d decrypt 解码
查看解密完的文件和原文件是否一致
[root@yunzu63 ~]# diff /etc/passwd /root/passwd #没有任何输出说明,两个文件内容一样
实例2:使用RSA算法进行非对称加密演示过程
安装:加密工具
[root@yunzu63 ~]# rpm -qf `which gpg`
gnupg2-2.0.14-4.el6.x86_64
yunzu63主机上
说明: gpg命令要在图形界面执行。因为执行过程中会弹出窗口。
[root@yunzu63 Desktop]# gpg --gen-key #生成密钥对
#产生一个新的密钥对 --gen-key generate(ˈjenəˌrāt产生) a new key pair
gpg (GnuPG) 2.0.14; Copyright (C) 2009 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? #直接回车,选择 RSA算法
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) #回车, 密钥长度: 2048
Requested keysize is 2048 bits
Please specify how long the key should be valid. #请指定密钥多长时间有效
0 = key does not expire #0表示,永不过期
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) #回车
Key does not expire at all
Is this correct(正确)? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: yunzu #密钥的名字
Email address: 1@163.com
Comment: yunzursa
You selected this USER-ID:
"yunzu (yunzursa) <1@163.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.
产生成随机事件:
[root@yunzu64 ~]# find /
3.2 查看密钥对
[root@yunzu63 Desktop]# file /root/.gnupg/pubring.gpg
/root/.gnupg/pubring.gpg: GPG key public ring
[root@yunzu63 Desktop]# file /root/.gnupg/secring.gpg
实战:实现yunzu63和yunzu64 之间使用非对称加密方法传输数据
#复制公钥到另一台机器yunzu64上
[root@yunzu63 ~]# scp /root/.gnupg/pubring.gpg 192.168.1.64:/root/
测试加密解密:
客户端: yunzu64:
[root@yunzu64 ~]# which gpg
/usr/bin/gpg
[root@yunzu64 ~]# rpm -qf /usr/bin/gpg
gnupg2-2.0.14-4.el6.x86_64
查看公钥:
[root@yunzu64 ~]# gpg --list-keys
3.3 导入公钥
[root@yunzu64 ~]# gpg --import /root/pubring.gpg
gpg: key 01B94CBE: public key "yunzu (yunzursa) <1@163.com>" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
[root@yunzu64 ~]# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub 2048R/01B94CBE 2014-12-20
uid yunzu (yunzursa) <1@163.com>
sub 2048R/5B3C7567 2014-12-20
3.4 使用公钥加密:
[root@yunzu64 ~]# cp /etc/passwd /root
[root@yunzu64 ~]# gpg -ear yunzu /root/passwd
参数:
-a, --armor 装甲 ['ɑ:mə] create ascii armored output 以ASCII的方式输出
-r, --recipient接受者[rɪˈsɪpiənt] USER-ID encrypt for USER-ID指定加密使用的公钥的名字。
-e, --encrypt [ɪnˈkrɪpt] encrypt data
-d, --decrypt [di:ˈkrɪpt] decrypt data (default)
gpg: 5B3C7567: There is no assurance this key belongs to the named user
pub 2048R/5B3C7567 2014-12-20 yunzu (yunzursa) <1@163.com>
Primary key fingerprint: 91DD 87D1 DF7D F82E F6EC 9165 E961 6018 01B9 4CBE
Subkey fingerprint: 5122 62B6 72A9 F771 F33A 1834 6406 913C 5B3C 7567
It is NOT certain that the key belongs to the person named
in the user ID. If you *really* know what you are doing,
you may answer the next question with yes.
Use this key anyway? (y/N) y
参数:
-ear :
-e, --encrypt加密 encrypt data
-a, --armor (盔甲) create ascii armored output #以ascII编码输出
-r, --recipient接收USER-ID encrypt for USER-ID 指定加密使用的公钥的名字。
[root@yunzu64 ~]# ls passwd*
passwd passwd.asc (加密后生成的文件)
[root@yunzu64 ~]# vim passwd
[root@yunzu64 ~]# vim passwd.asc #查看加密后的数据
解密:yunzu63
[root@yunzu64 ~]# scp passwd.asc 192.168.1.63:/root/
在yunzu63解密码:
[root@yunzu63 ~]# gpg --list-key
/root/.gnupg/pubring.gpg
------------------------
pub 2048R/EF0DC402 2016-03-18
uid yunzu (yunzursa) <1@163.com>
sub 2048R/63E9B374 2016-03-18
[root@yunzu63 ~]# gpg -dar yunzu -o passwd passwd.asc
参数:
-d 解密
-a, --armor (盔甲) create ascii armored output #以ascII编码输出
-r, --recipient USER-ID encrypt for USER-ID 指定加密使用的公司UID
-o 指定解密后的内容输出到文件中。
例:公钥私钥实例,实现yunzu63登录yunzu64时,不输入密码
[root@ yunzu63~]# ssh-keygen
复制公钥到yunzu64上:
[root@yunzu63 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.64
或:
[root@yunzu63 ~]# ssh-copy-id root@192.168.1.64
测试:
[root@yunzu64 ~]# ssh 192.168.1.64
4 md5-sha1-哈希算法使用方法
4.1 使用哈希算法保证数据完整性。
常见的哈希算法有:MD5 和 SHA1
MD5 ,SHA1 的区别:
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法)。MD5 算法的哈希值大小为 128 位。是一种不可逆的算法。
SHA1的全称是Secure Hash Algorithm(安全哈希算法)。SHA1 算法的哈希值大小为 160 位。是一种不可逆的算法
SHA1抗暴力破解能力比MD5强。
缺点:产生SHA-1 报文摘要的运行速度比MD5 慢。
哈希算法具有以下特点:
1、压缩性:任意长度的数据,算出的哈希值长度都是固定的。
2、容易计算:从原数据计算出哈希值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的哈希值都有很大区别。
4、弱抗碰撞:已知原数据和其哈希值,想找到一个具有相同哈希值的数据(即伪造数据)是非常困难的。
实例1:产成固定长度MD5消息摘要
[root@yunzu63 ~]# md5sum /etc/passwd
d5712ff41f92511823453e10e433b948 /etc/passwd
[root@yunzu63 ~]# sha1sum /etc/passwd
e3cd228d75a0cee98c82848d4f1d82fa4b4b7710 /etc/passwd
实例2:使用MD5加密密码:
[root@yunzu63 ~]# echo 123 | md5sum
ba1f2511fc30423bdbb183fe33f3dd0f -
[root@yunzu63 ~]# echo 1234 | md5sum
e7df7cd2ca07f4f1ab415d457a6e1c13 -
实例3:演示MD5保障数据的完整性:
使用MD5检查先前使用rsa私钥解密后的文件和原文件是否一致
[root@yunzu63 ~]# scp /root/passwd 192.168.1.64:/opt/ #把解密的文件复制到yunzu64
[root@yunzu64 ~]# md5sum /etc/passwd /opt/passwd #在yunzu64上进行对比,如果哈希值一样,说明正确。
d5712ff41f92511823453e10e433b948 /etc/passwd
d5712ff41f92511823453e10e433b948 /opt/passwd
[root@yunzu63 ~]# md5sum /dev/sda1 #可以分区取一个哈希值。