安全
ssl 功能
机密性 认证 完整性 重放保护
TLS协议工作在应用层的下层传输层的上层
TLS协议(也是大的协议集合)
Handshake协议:协商 服务器身份验证 密钥交换
ChangeCipherSpec协议:代表握手阶段已经完成 会发送消息通知
Alert协议:警报 warning(警告) fatal(高度危险)
Record协议:对消息认证和完整性保护 加密等
HTTPS协议:和ssl/tls协议的组合
https工作过程
1 客户端发送hello消息给服务器
2 服务器将CA签过名的私钥证书发送给客户端
3 客户端拥有CA的公钥就可以解开CA签过名的私钥证书 从而得到服务器公钥
4 客户端随机生成对称密钥 使用解密出来的服务器公钥加密再发送给服务器
5 服务器收到后使用自己的私钥解密获取对称密钥
6 双方都拥有了对称密钥就可以使用对称密钥加密
支持ssl功能的Openssl
openssl命令
对称加密:
工具:enc
帮助:man enc
openssl enc -e -des3 -a -salt -in fstab -out fstab.des3(将fstab文件使用对称秘钥进行加密)
-a:使用base64编码
-e:加密
-des3:使用des3算法加密
-in:输入文件
-out:将加密后的文件生成为一个新的文件
-salt:指定盐
解密:
openssl enc -d -des3 -a -salt -in fstab.des3 -out fstab
-d:解密
-salt:指定盐(随机字符中第二个$到第三个$之间的值成为盐)
生成文件hash值
工具:dgst
帮助:man dgst
openssl dgst -md5[-hex] fstab(生成此文件的hash值)
-hex:默认,16进制
生成用户密码
passwd
-1:代表md5
openssl passwd -1(生成密码的md5值)
生成随机数
帮助:man sslrand
openssl rand -base64 10(随机生成10位的base64的字符)
-base64位置可以替换不同的编码格式;当换成hex时那么每个字符为16进制,相当于4位二进制,出现的字符数要x2
生成私钥加密
(umask 066;openssl genrsa -out test.key 2048)
(umask 066;openssl genrsa -out test2.key -des3 4096)将生成的私钥文件使用对称算法加密
-out:生成后的私钥文件名称
2048:长度 可自行修改
-des3:对称算法加密
修改umask值 这样生成的文件默认权限就为600提高安全性 如果不在括号中执行后续创建的文件默认权限都会为600 括号的含义是在子shell中执行 不影响后续创建文件的操作
解密被加密的私钥
openssl rsa -in test2.key -out test2.key.out
选项含义同上
从私钥中提取公钥
openssl rsa -in test.key -pubout -out test.key2.pub
-in:从test.key文件
-pubout:输出
-out:到test.key2.pub
生成随机数
根据键盘和鼠标的操作生成随机数
/dev/random:生成随机数的文件 并且需要操作鼠标和键盘才能生成随机数
/dev/urandom:不停的生成随机数
cat /dev/urandom | tr -dc '[:alnum:]' | head -c30 由于/dev/urandom中会不断的生成随机数 于是要使用"tr"取除了数字的所有随机数 并且取前30个字节
CA的搭建
建立私有CA:
OpenCA
openssl
证书申请以及签署步骤:
1 生成申请请求
2 RA核验
3 CA签署
4 获取证书
/etc/pki/tls/openssl.cnf : openssl生成证书需要用到的配置文件
1 创建所需要的文件
touch /etc/pki/CA/index.txt 生成证书数据库文件
echo 01 > /etc/pki/CA/serial 指定第一个颁发证书的序列号
2 搭建CA
生成私钥
cd /etc/pki/CA/ #生成的私钥必须要在这个目录下 并且私钥名比喻为cakey.pem
(umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
生成自签名证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
-new:生成新证书请求
-x509:用于自签证书
-key:生成请求时用到的私钥文件
-days 3650(以天为单位):证书的有限期限
-out:证书保存路径
操作完成后系统会提示输入一系列信息
国家:
省:
城市:
公司名:
部门:
网站名:*.域名(泛域名)比如*.tianmao.com
邮箱(可选):
文件生成
openssl x509 -in cacert.pem -noout -text #以文本方式查看自签证书
3 客户端申请证书
1 创建私钥
(umask 066;openssl genrsa -out /app test.key 2048)
/app:私钥存放位置
test.key:私钥名称
2 申请证书
openssl req -new -key test.key -out app.csr
操作完成后系统会提示输入信息
国家: 与上述相同
省: 与上述相同
城市: 可以不同
公司名: 与上述相同
部门: 可以不同
网站名:*.test.com(给这个网站颁发证书)
邮箱(可选):
3 将证书申请文件存放到CA服务器并检查申请信息
4 颁发证书
openssl ca -in app.csr -out certs/app.crt -days 730
[ ca ]
default_ca = CA_default #默认使用的CA
#unique_subject = no #是否允许申请两次
[ CA_default ]
dir = /etc/pki/CA #CA工作的主目录
certs = $dir/certs #存放证书文件的位置
crl_dir = $dir/crl #吊销证书列表
database = $dir/index.txt #将证书信息添加到这个文件中
new_certs_dir = $dir/new_certs #默认证书的路径
certificate = $dir/cacert.pem #私钥存放位置
serial = $dir/serial #证书的编号 存放的是下一个要颁发的证书的编号
crlnumber = $dir/crlnumber #吊销证书的编号
crl = $dir/crl.pem #
default_days = 365 #证书有效期 默认365天
default_md = sha256 #默认算法
policy = policy_match 或者 policy_anything
[ policy_match ]
countryName = match #两边国家必须相同
stateOrProVinceName = match #省份
organizationName = match #地区名
commonName = supplied #部门名
[ policy_anything ]
内容全为"optional" 也就是有些选项可以不同
Openssh
工具:
基于C/S结构
Client:ssh,scp,sftp,slogin
Windows客户端:
xshell,putty,securecrt,sshsecureshellclient
Server:sshd
ssh客户端
ssh配置文件:/etc/ssh/ssh_config
.ssh文件中存放的是登录过的主机的公钥,也就是已知主机,下次登录不会提示yes or no;known_hosts文件中的内容与登录过主机下的/etc/ssh/ssh_host_rsa_key.pub内容相同
格式:ssh [[email protected]]host [command]
例子:ssh [email protected] who 在目标主机上执行who命令
-p port:指定服务器端端口号 默认为22;"可在/etc/ssh/ssh_config中修改Port这一行的端口号 对正在连接的用户不起作用"
-b:指定连接的源IP;"当发起端IP不止一个的时候并且想刻意使用某一个ip去连接就使用此选项"
-v:显示连接的详细过程
-C:压缩;可使数据包变小
-X:支持x11转发;"可以在目标主机上启用图形化的功能"
-t:A-->B-->C当C禁止A连接则A可以使用ssh -t "B的IP" ssh "C的IP"
ssh服务登录验证
基于用户名口令验证
1 客户端发起ssh请求,服务器会把自己的公钥发送给客户端
2 用户会根据服务器发来的公钥对密码进行加密
3 加密后传给服务器,服务器使用自己的私钥解密,密码正确,登录成功
/etc/ssh中存放了许多公钥与私钥".pub"后缀的为公钥
基于密钥的验证方法
1 在客户端生成一对儿密钥,将公钥复制给服务器端并且在服务器端自动存放到authorized_keys
2 客户端发起连接请求,服务器端收到后会在存放公钥的位置查,如果有对应的主机和用户信息,会生成随机字符串 将字符串使用客户端的公钥进行加密传送给客户端
3 客户端收到后使用私钥解密查看字符串是否相等,相等的话传送给服务器端查看是否相等,相等就可以进行互相
实现基于密钥的验证方法:
1在客户端生成秘钥对
ssh-keygen -t rsa [-P ''] [-f "~/.ssh/id_rsa"] 中括号内可不指定
-P:给秘钥加口令
-t:指定算法;默认为rsa算法
-f:指定生成的文件存放的位置;默认就为用户家目录下的/.ssh/id_rsa下
2 把公钥文件传输到服务端对应用户的家目录
ssh-copy-id -i id_rsa.pub [email protected]"对方IP地址"
3 再次登录可以不用输入用户名密码直接登录
转换不正确的公钥格式
ssh-keygen -i -f "公钥文件名称"
###给生成好的密钥添加口令:ssh-keygen -p 再次登录需要输入私钥的密码
将私钥的密码交给代理程序,这样以后连接也不用输入私钥的密码,但关闭终端连接后代理也会停止,每次连接要启动一下代理
1 启动代理程序
ssh-agent bash
2 将私钥口令用它代理
ssh-add
要添加新的基于密钥的验证的话;将客户端公钥发送到被连接主机并且将内容追加到 authorized_keys中即可
解决ssh连接过慢
修改服务器端的/etc/ssh/sshd_config中的UseDNS no以及GSSAPIAuthentication no
sshd服务的配置文件,两个文件都存放在/etc/ssh目录下
ssh_config:客户端配置文件
Port:默认连接端口 -p可以指定端口号
StrictHostKeyChecking ask:管理第一次连接是否提示yes or no,不启用的话讲ask改为no
scp命令:
scp [options]源...目标/
两种方式:
scp [options] [[email protected]]host:/sourcefile /目标路径
scp [options] /sourcefile [[email protected]]host:/目标路径
[options]:
-q:静默模式
-r:递归复制
-C:压缩
-p:保持源文件的属性
-P:指定端口
rsync
rsync [options] "文件名" "目标IP:/目标目录路径"
比scp更快,只复制发生变化的文件
注意:如果要复制整个目录就不要在目录最后加"/" 加了/的话就把整个目录复制过去
选项:
-n 模拟复制过程
-v 显示详细过程
-r 递归复制目录
-p 保留权限
-t 保留时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-a 保留源文件所有属性
sftp命令
sftp "目标IP地址"
基于ssh协议的ftp
带!的命令是在本地执行
get:下载
put:上传
?:查看帮助
pssh工具(适用于小型环境)
语法:pssh [options] [[email protected]]hostip command
pssh存放在epel源中
注意:执行命令中如果存在星号 $符号的时候需要用单引号将命令引起来才能实现在目标主机上操作
-H:指定对方的IP地址 后方可以跟多个主机IP地址双引号引起来 用空格隔开
-i:将结果输出
-h:读取文件中数据 可将多个主机ip地址写入到文件中 使用-h读取文件数据
-o:将输出结果生成文件单独放在指定目录中 以ip地址为文件名
pscp.pssh将本地文件批量复制到远程主机(要在基于密钥验证的前提下才能使用)
语法:pscp.pssh [options] [本地文件or目录] [目标主机文件or目录]
-h:读取文件中数据 可将多个主机ip地址写入到文件中 使用-h读取文件数据
-v:显示复制过程
-a:保留所有常规属性
-r:递归复制目录
-H:指定目标主机ip地址
将目标主机文件拉取到本机
pslurp -h ip.txt -L /app /var/log/secure remote_secure
-L:指定本地目录
remote_secure:复制到本地/app目录下并且改名
ssh的端口转发
例子:
从外部向内部
C是telnet服务器
B是ssh服务器
A是ssh telnet客户端
在A主机上进行操作
当A想通过telnet访问C的时候过程可能不安全,所以可以使用ssh进行端口转发,建立隧道,使用ssh协议封装telnet 访问,过程相对安全
A主机端口随机
1 建立隧道
ssh -L A主机端口:C telnet主机IP:C主机的telnet端口 B主机的IP -Nf
-N:不登录目标shell
-f:后台运行
2 telnet 127.0.0.1 端口 此时建立成功 但在C服务器上认为的是B主机在访问
从内部向外部
A为ssh服务器
B为ssh客户端
C为smtp服务器
在B主机上进行操作
1 ssl -R A主机sshd服务的端口:C主机IP:C主机的smtp端口 A主机的IP -Nf
2 telnet 127.0.0.1 端口
动态端口转发:
例子:
A为国内服务器
B为中间服务器
C为google服务器
1 在C服务器上搭建httpd服务
yum -y install httpd
2 在C服务器上设置防火墙策略禁止A访问
iptables -A INPUT -s A主机IP -j REJECT
3 在A服务器上执行;A与B服务器建立了ssh连接;在A服务器上的浏览器中进行代理设置;
ssh -D "随机本地端口" B服务器IP地址 -N
4 测试
curl --socks5 127.0.0.1:A上的随机端口 http://C主机IP地址
ssh服务器:
服务器端:sshd
配置文件:/etc/ssh/sshd_config
# Port:端口;
# AddressFamily any:支持的ip格式,ipv4 ipv6默认都支持;
# ListenAddress:默认监听的IP地址是任意的,后方对应的ip就是对外可连接的ip地址;
# HostKey:对应的私钥;
# LoginGraceTime 2m:登录最长时间;
# PermitRootLogin:禁止root用户连接,默认是可以的;
# StrictModes:检查.ssh/目录下的权限;权限不正确拒绝连接;
# MaxAuthTries 6:默认最多错误输入3次;设置的值的一半;
# MaxSessions 10:在一个连接的情况下最多建立多少个会话,针对克隆连接;
# PubkeyAuthentication yes:是否支持基于密钥的连接
# PasswordAuthentication yes:是否支持用户名密码的连接;一般都是禁用此项使用基于密钥的连接
# PermitEmptyPasswords:是否允许空口令
# GatewayPorts no:是否充当网关
# ClientAliveInterval:多久发送检查,检查如果没有任何操作就断开;默认为永久不断开
# ClientAliveCountMax:最多发送几个检查
# UseDNS:将DNS反向解析改为no可提升速度
# GSSAPIAuthentication:改为no提升连接速度
# MaxStartups:用户没有输入密码的连接数,达到10个以上会拒绝没有验证的用户,以30%的比例拒绝,当10-100的时候比例增长,并发最多达到100个;
# Banner:连接上目标主机之后的提示信息(写在一个独立的文件中,sshd_config配置文件中Banner后写的是文件的绝对路径)
限制可登录用户的方法:
/var/log/secure中可查看到sshd的日志
# 手动添加Allowusers "用户名" 没有写的所有用户都不可以连接,包括root
# 手动添加Denyusers "用户名" 拒绝指定用户连接 当Allowusers和Denyusers都有同一个用户时,拒绝优先
# Allowgroups "组名" 写的组可以连接
# Denygroups "组名" 写的组都拒绝连接;
AIDE:文件完整性检查和入侵检查
安装:yum -y install aide
aide.conf为配置文件
CONTENT_EX在配置文件中定义了关心哪几个位置
# /boot/ CONTENT_EX:对boot这个目录进行所有权限的记录
........等多个目录相同含义
也可以自定义关键字,方便后期要监控的目录进行引用
# CUSTOM = p+u+g+s+sha256+m+acl
# /app CUSTOM #监控app目录下的CUSTOM后方对应的属性,一系列属性在配置文件中有解释
# !/app/f3 #加!的意思是不关心app目录下的f3文件
# aide --update #更新数据库中的信息
# aide --init #生成新的数据库中的信息
新的生成的aide.db.new.gz文件要改为aide.db.gz才能进行比对
# aide --check #比对数据库中的信息和当前被监控的目录的信息
/var/log/aide为日志文件路径
更改身份
su 切换身份: su -l username -c 'command'
使用用户登录并且执行后面的命令
sudo
-u:指定要代表的用户
-V:查看版本配置信息
-l,ll:列出用户在主机上可用和禁用的命令
-k:清除时间戳,下次使用sudo需要输入密码
-v:将密码有效期延长
-K:删除时间戳文件
-b:在后台执行指令
-p:改变输入密码的提示符
/etc/sudoers:在此文件中授权
可使用visudo拥有语法检查功能,如果有问题,保存退出会提示
格式:username 登录主机=(以哪个用户的身份) 要执行的命令;多条命令以逗号作为分隔符,需要些绝对路径
登录主机:写哪一个IP就只能在哪台主机上进行sudo操作,可以写多个地址或网段
例子:
1 fang ALL=(root) /usr/bin/mount /dev/cdrom /media #使fang用户以root用户使用挂载命令
如果想要用户可以任意挂载到任何位置将/dev/cdrom /media等去掉只写命令的绝对路径即可
2 如果想要单个用户使用单个配置文件则可以在/etc/sudoers.d下创建文件即可
例子:
vim /etc/sudoers.d/fang #创建新文件
fang ALL=(root) /usr/bin/mount,/usr/bin/umount,/usr/bin/cat /etc/shadow #文件中的格式
3 /etc/sudoers中%开头的就是对组的配置
%wheel ALL=(ALL) ALL #wheel组默认存在将用户加入到此组中就附带ALL权限
usermod -G wheel fang #fang用户拥有wheel组的所有权限
例子2:
如果希望普通用户可以查看/var/log/secure-`date +%F`的日志信息按以下方式写
vim /etc/sudoers.d/fang
fang ALL=(root) /usr/bin/cat /var/log/secure*,!/usr/bin/cat /var/log/secure* * #既防止了用户访问别的文件也赋予了正确权限
sudo在配置文件中,还支持通配符的使用
sudo别名和实例
用户:user
以哪个用户身份运行:runas
通过哪些主机:host
运行的命令:command
别名拥有四种类型:
USER_Alias
Runas_Alias
Host_Alias
Cmnd_Alias
别名格式
别名名称要为大写在,多个命令使用逗号隔开
User_Alias "别名名称" = "包括的用户名"
Cmnd_Alias "命令别名" = "命令的绝对路径"
用户别名名称 ALL=(root) 命令别名名称
TCP_Wrappers守护进程
工作在传输层的TCP协议
判断服务是否能够由tcp_wrapper进行访问控制的方法:
ldd "程序的绝对路径" (libwarp.so)
配置文件:/etc/hosts.allow,/etc/hosts.deny
当hosts.allow文件中没有匹配条件的时候才去查看hosts.deny文件
格式:
/etc/host.deny,修改完整后即时生效
"进程名称","第二个进程名称":"要拒绝的ip地址" 空格隔开多个IP
当两个文件都没有定义的话默认是允许连接的
例子:
in.telnetd,[email protected]:ALL(拒绝所有通过telnet以及ssh访问172.18.0.6的ip地址)
sshd:192.168.27. EXCEPT 192.168.27.7(拒绝所有27网段的ip,仅允许192.168.27.7访问,要在allow文件中写27.7的地址,也可以在deny中如此定义)
EXCEPT:排除后方的ip或网端
sshd:192.168.27. :spawn echo `date +%%F` client login > /app/tcp_warppers.log(记录27网段登录后会将echo后面的信息输入到文件中)
spawn:开启一个进程
%c:客户端信息
%s:服务器信息
%u:用户
twist:当客户端连接到服务端的时候执行twist后方定义的操作,而服务不做响应
sshd:192.168.27. :twist /bin/echo "Deny access Server sshd 403" (当27网段的客户端来通过sshd连接到服务端的时候不会响应并且回回复twist后方信息)
PAM:可插入的认证模块
认证库:文本文件(/etc/passw;/etc/shadow),MySQL,NIS,LDAP
远程登录,本地登录
PAM相关文件
模块文件目录:/lib64/security/*.so
环境相关配置:/etc/security/(有些模块比较简单没有配置文件,比较复杂的就拥有配置文件在此处,模块在上方目录)
主配置文件:/etc/pam.conf;默认不存在
为每种应用模块提供一个专用的配置文件:/etc/pam.d/应用名称,格式与主配置文件基本相同,文件中主要描述是如何调用/lib64/security/*.so文件
注意:如果/etc/pam.d存在,那么/etc/pam.conf文件将会失效
PAM模块认证过程:
Service(服务)→PAM(配置文件)→pam_*.so
PAM首先确定一项服务,然后加载相应的PAM的配置文件(/etc/pam.d/*.conf),然后通过配置文件查看调用某一个模块以及认证过程
通用配置文件/etc/pam.conf格式
application type control module-path arguments #不常用
专用配置文件/etc/pam.d/*格式
type control module-path arguments
type(类型): Auth(验证账号是否合法)
Account(判断账号是否可登陆)
Password(在用户修改密码的时候做复杂检查)
Session(用户在使用服务之前或使用服务之后附带的一系列信息;比如在用户登陆后是否要记录日志)
-Auth|Account|Password|Session:(对应模块没有安装的话不会记录到日志,不会报错)
control(控制):PAM如何处理模块的成功或失败情况
required:一票否决,还会继续检查,但总体来说已经失败,下面有通过也没用;本模块必须成功不代表一定成功,但是不一定一定成功,因为后方还有检测
requisite:一票否决,如果失败就直接失败,不会继续向下检查
sufficient:一票通过,如果返回通过,则通过,后面就不用看了
optional:结果忽略,不影响结果
include:指定后方模块是调用
module-path(模块路径):默认就去/lib64/security下查找
arguments(参数):传递给模块的参数
例子1 :
模块:pam_shells.so
说明:检查登录有效shell
ssh服务没有调用此项模块,所以对sshd无效,编辑/etc/pam.d/sshd在其中添加
auth required pam_shells.so #当ssh连接的用户使用的shell不在/etc/shells中就会拒绝连接
例子2 :
模块:pam_securetty.so
说明:如果用户登录的是安全的tty(/etc/securetty)则允许root登录,否则不允许root登录,不针对其他用户
telnet默认就是不允许root登录
remote中调用了pam_securetty.so模块,就是所有远程连接如果不是安全的tty都不可以登录;包括telnet,在/etc/securetty中添加tty即可登录
例子3 :
模块:pam_nologin.so
说明:man pam_nologin
当/etc/nologin存在的时候,拒绝用户的登录,并且文件内容将显示在登录提示位置,对root用户不影响
touch /etc/nologin #创建/etc/nologin文件
vim /etc/pam.d/su auth required pam_nologin.so #编辑/etc/pam.d/su添加auth required pam_nologin.so
这样使用su切换用户的时候也是不可以的,默认是可以的
例子4 :
模块:pam_limits.so
说明:限制用户系统资源使用,对root也有影响
ulimit:限制资源,包括shell以及进程创建
-a:显示当前所有ulimit限制
open files:最多打开的文件个数,默认为1024;每发起一个连接就会打开一个sockets文件
-n:修改最多打开文件个数,最大接收的并发连接数(普通用户只能调小不能调大)
cpu time:每运行一个程序使用的cpu的时间
max user processes:最大用户的进程数,最多这么多进程
配置文件:/etc/security/limits.conf
-:包括软硬限制都做了限制
nproc:最大进程数
比如"fang"这个用户最大打开10个进程就使用以下格式
# fang - nproc 10 #如果用户名部分写组名的话则要加上@符号
ab -c 10 -n 200 http://IP/
-c:并行发起10个链接
-n:总链接数200个
原文地址:http://blog.51cto.com/kaikai0720/2058909