加密和安全初解

安全机制

信息安全防护的目标
保密性 Confidentiality
完整性 Integrity
可用性 Usability
可控制性Controlability
不可否认性 Non-repudiation
安全防护环节
物理安全:各种设备/主机、机房环境
系统安全:主机或设备的操作系统
应用安全:各种网络服务、应用程序
网络安全:对网络访问的控制、防火墙规则
数据安全:信息的备份与恢复、加密解密
管理安全:各种保障性的规范、流程、方法

#不安全的登录示例
select * from user where  username="xxx" and password="xxx"
password="x' or "1=1

安全算法(DES)

常用安全技术
认证
授权
审计
安全通信
密码算法和协议:
对称加密
公钥加密
单向加密
认证协议
Linux系统:OpenSSL, gpg(pgp协议的实现)
非对称加密
公钥加密:密钥是成对出现
公钥:公开给所有人;public key
私钥:自己留存,必须保证其私密性;secret key
特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然
功能:
数字签名:主要在于让接收方确认发送方身份
对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
数据加密:适合加密较小数据
缺点:密钥长,加密解密效率低下
算法:RSA(加密,数字签名),DSA(数字签名),ELGamal

算法  加密前     加密后  加密时间   解密时间
DES     1G        2G      4m              8m
RSA     1G        1G        1m            64h

哈希算法----单向散列算法
hash(data)=digest 摘要
digest不可反推data.
digest长度固定
MD5:128
sha1:160
sha512:512

gpg 实现对称加密
gpg -c file  #加密
gpg -d file  #解密
.gnupg
gpg --gen-key
gpg -a --export -o magedu.pubkey
gpg --import magedu.pukey #导入mage的公钥
gpg --list-keys
gpg -e -r magedu fstab  #加密
gpg -o f1 -d fstab.gpg    #解密

gpg --delete-keys magedu
gpg --delete-secret-keys magedu

A发送前的动作:Pb{data+Sa{hash(data)}}
B接受后的动作: Sb---data+sa{hash(data)}
a1为B解封装用统一的hash运算a1=hash(data) a2=Pa-----hash(data)---digest
a1=a2,原文未被修改。

openssl

OpenSSL:开源项目
三个组件:
openssl: 多用途的命令行工具,包openssl
libcrypto: 加密算法库,包openssl-libs
libssl:加密模块应用库,实现了ssl及tls,包nss
openssl命令:
两种运行模式:交互模式和批处理模式
openssl version:程序版本号
标准命令、消息摘要命令、加密命令
标准命令:
enc, ca, req, ...

$1$O00iE0kF$XldXxBeSm6s50Pijm9yQB
1为MD5 salt为O00iE0kF

生成私钥
(umask 077; openssl genrsa –out test.key –des 2048)
从私钥中提取公钥
openssl rsa -in private.key2 -pubout -out public.key2

实验:向CA申请证书

1.建立root CA ;root CA

服务器上生成私钥

/etc/pki/tls/openssl.cnf
[ CA_default ]
dir     = /etc/pki/CA       # Where everything is kept
certs       = $dir/certs        # Where the issued certs are kept
crl_dir     = $dir/crl      # Where the issued crl are kept
database    = $dir/index.txt    # database index file.
#unique_subject = no            # Set to 'no' to allow creation of
                    # several ctificates with same subject.
new_certs_dir   = $dir/newcerts     # default place for new certs.

certificate = $dir/cacert.pem   # The CA certificate
serial      = $dir/serial       # The current serial number
crlnumber   = $dir/crlnumber    # the current crl number
                    # must be commented out to leave a V1 CRL
crl     = $dir/crl.pem      # The current CRL
private_key = $dir/private/cakey.pem # The private key
RANDFILE    = $dir/private/.rand    # private random number file
x509_extensions = usr_cert      # The extentions to add to the cert       

2.自签名rootCA

(umask 077;openssl genrsa -out private/cakey.pem 4096 )
tree 
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
cat cacert.pem 
openssl x509 -in cacert.pem -noout -text
openssl x509 -in cacert.pem -noout -dates
openssl x509 -in cacert.pem -noout -issuer

-new: 生成新证书签署请求
-x509: 专用于CA生成自签证书
-key: 生成请求时用到的私钥文件
-days n:证书的有效期限
-out / PATH/TO/SOMECERTFILE : 证书的保存路径

3.生成私钥及证书申请文件

服务器或用户申请证书

(umask 077;openssl genrsa -out app.key 1024) 
openssl req -new -key app.key -out app.scr
scp app.scr 192.168.1.8:/etc/pki/CA

4.申请文件发给CA,CA颁发证书

touch index.txt
echo 00 > serial 
openssl ca -in app.scr  -out certs/app.crt -days 100 
ll certs/app.crt 

证书发送给客户端

基于key认证

基于密钥的登录方式
1 首先在客户端生成一对密钥(ssh-keygen)
2 并将客户端的公钥ssh-copy-id 拷贝到服务端
3 当客户端再次发送一个连接请求,包括ip、用户名
4 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:acdf
5 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
6 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
7 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
基于密钥的认证:
(1) 在客户端生成密钥对

扫描二维码关注公众号,回复: 977774 查看本文章
ssh-keygen -t rsa [-P ''] [-f “~/.ssh/id_rsa"]

(2) 把公钥文件传输至远程服务器对应用户的家目录

ssh-copy-id [-i [identity_file]] [user@]host

(3) 测试
(4) 在SecureCRT或Xshell实现基于key验证
在SecureCRT工具—>创建公钥—>生成Identity.pub文件
转化为openssh兼容格式(适合SecureCRT,Xshell不需要转化格式),并复制到需登录主机上相应文件authorized_keys中,注意权限必须为600,在需登录的ssh主机上执行:

ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys

(5)重设私钥口令:
ssh-keygen –p
(6)验证代理(authentication agent)保密解密后的密钥
• 这样口令就只需要输入一次
• 在GNOME中,代理被自动提供给root用户
• 否则运行ssh-agent bash
(7)钥匙通过命令添加给代理
ssh-add

实验:实现100台主机基于key的验证,实现远程管理.

批量解决多台服务器基于key的验证登录:

cat >> ip.txt <<EOF
192.168.1.6:passwd
192.168.1.7:passwd
192.168.1.8:passwd
192.168.1.9:passwd
192.168.1.10:passwd
EOF
#!/bin/bash
rpm -q expect &> /dev/null || yum install -y -q
[ -d /root/.ssh ] &&  rm -rf /root/.ssh
ssh-keygen -P "" -f "/root/.ssh/id_rsa"
while read line;do
ip={line[%%:*]}
password={line[##*:]}
expect << EOF
set timeout 10
spawn ssh-copy-id $ip
expect {
    "yes/no" { send "yes\n";exp_continue }
    "password" { send "$password\n" }
}
expect eof
EOF                                              
done < ip.txt

pssh

pssh是一个python编写可以在多台服务器上执行命令的工具,也可实现文件复制br/>选项如下:
--version:查看版本
-h:主机文件列表,内容格式'[user@]host[:port]'
-H:主机字符串,内容格式'[user@]host[:port]'
-l:登录使用的用户名
-p:并发的线程数【可选】
-o:输出的文件目录【可选】
-e:错误输入文件【可选】
-t:TIMEOUT 超时时间设置,0无限制【可选】
-O:SSH的选项
-v:详细模式
-A:手动输入密码模式
-x:额外的命令行参数使用空白符号,引号,反斜线处理
-X:额外的命令行参数,单个参数模式,同-x
-i:每个服务器内部处理信息输出
-P:打印出服务器返回信息
pscp.pssh
pscp.pssh功能是将本地文件批量复制到远程主机

pscp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir]
[-t timeout] [-O options] [-x args] [-X arg] local remote

Pscp-pssh选项
-v 显示复制过程
-a 复制过程中保留常规属性
-r 递归复制目录

#将本地curl.sh 复制到/app/目录
pscp.pssh -H 192.168.1.10 /root/test/curl.sh /app/
pscp.pssh -h host.txt /root/test/curl.sh /app/
#将本地多个文件批量复制到/app/目录
pscp.pssh -H 192.168.1.10 /root/f1.sh /root/f2.sh /app/
#将本地目录批量复制到/app/目录
pscp.pssh -H 192.168.1.10 -r /root/test/ /app/

pslurp
pslurp.pssh功能是将远程主机的文件批量复制到本地

pslurp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par][-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] [-L localdir]

remote local(本地名)
Pslurp-pssh选项
-L 指定从远程主机下载到本机的存储的目录,local是下载到本地后的名称
-r 递归复制目录

#批量下载目标服务器的messages文件至/data下,并更名为m
pslurp -H 192.168.1.10 -L /data/ /var/log/messages m

##SSH端口转发
SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH
还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的
加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为
其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,
LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文
传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是
允许 SSH 的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯
SSH 端口转发能够提供两大功能:
加密 SSH Client 端至 SSH Server 端之间的通讯数据
突破防火墙的限制完成一些之前无法建立的 TCP 连接

场景1:在外地的client想访问公司的telnet服务器(不能直连),我在外地。

localclient:192.168.30.7 sshsrv:6 telnetsrv:17
ssh -L 9527:192.168..30.17:23 -Nf 192.168.30.6 (搭桥梁)
telnet 127.0.0.1:9527 直连telnet服务器
保证telnet-server包在服务器上有安装
centos上telnet不让root登录,只允许普通用户登录

场景2 :在外地的client想访问公司的telnet服务器(不能直连),我在lanserver。

lanserver:ssh client; telnet client:192.168.30.6
internet client:192.168.30.7
telnetsrv:192.168.30.17
在lanserver上操作:
ssh -R 9527:192.168.30.17:23 -Nf 192.168.30.7

跳板原理

当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问
请求被转发到sshserver上,由sshserver替之访问internet
ssh -D 1080 root@sshserver
curl -socks5 127.0.0.1:1080
http://www.qq.com

ssh协议的另一实现:dropbear

dropbear编译
yum groupinstall “Development tools”
下载dropbear-2018.76.tar.bz2
tar -xvf dropbear-2018.76.tar.bz2
less INSTALL RAEDME
./configure --prefix=/data/dropbear --sysconfdir=/etc/dropbear/
make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
mkdir /etc/dropbear #confdir没有生成成功,自建这个文件夹
cat >>/etc/profile.d/dropbear.sh<< EOF
PATH=/data/dropbear/bin/:/data/dropbear/sbin/:$PATH
EOF #添加环境变量
. /etc/profile.d/dropbear.sh
dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048
dropbear -p :9528 -F –E #前台运行
dropbear -p :9528 #后台运行
客户端:ssh 192.168.1.8 -p 9528

tcp_wapper 实现安全控制

1.实现主机的访问控制。

客户端Client_list格式
以逗号或空格分隔的客户端列表
基于IP地址:192.168.10.1 192.168.1.
基于主机名:www.qq.com .qq.com 较少用
基于网络/掩码:192.168.0.0/255.255.255.0
基于net/prefixlen: 192.168.1.0/24(CentOS7)
基于网络组(NIS 域):@mynetwork
内置ACL:ALL,LOCAL,KNOWN,UNKNOWN,PARANOID

#只允许192.168.1.0/24的主机访问sshd
/etc/hosts.allow
sshd: 192.168.1.
/etc/hosts.deny
sshd :ALL

2.日志功能

sshd: ALL :spawn echo "$(date +%%F) login attempt from %c to %s,%d" >>/var/log/sshd.log

说明:
在/etc/hosts.allow中添加,允许登录,并记录日志
在/etc/hosts.deny中添加,拒绝登录,并记录日志
%c 客户端信息
%s 服务器端信息
%d 服务名
%p 守护进程的PID
%% 表示%
vsftpd: 172.16. :twist /bin/echo “connection prohibited”

AIDE

当一个入侵者进入了你的系统并且种植了木马,通常会想办法来隐蔽这个木马
(除了木马自身的一些隐蔽特性外,他会尽量给你检查系统的过程设置障碍),
通常入侵者会修改一些文件,比如管理员通常用ps -aux来查看系统进程,那么
入侵者很可能用自己经过修改的ps程序来替换掉你系统上的ps程序,以使用ps
命令查不到正在运行的木马程序。如果入侵者发现管理员正在运行crontab作
业,也有可能替换掉crontab程序等等。所以由此可以看出对于系统文件或是关
键文件的检查是很必要的。目前就系统完整性检查的工具用的比较多的有两款:
Tripwire和AIDE,前者是一款商业软件,后者是一款免费的但功能也很强大的工
具
AIDE能够构造一个指定文件的数据库,它使用aide.conf作为其配置文件。AIDE
数据库能够保存文件的各种属性,包括:权限(permission)、索引节点序号
(inode number)、所属用户(user)、所属用户组(group)、文件大小、最后修改时
间(mtime)、创建时间(ctime)、最后访问时间(atime)、增加的大小以及连接数。
AIDE还能够使用下列算法:sha1、md5、rmd160、tiger,以密文形式建立每个
文件的校验码或散列号.
yum install aide
修改配置文件
vim /etc/aide.conf (指定对哪些文件进行检测)
/test/chameleon R
/bin/ps R+a
/usr/bin/crontab R+a
/etc PERMS
!/etc/mtab #“!”表示忽略这个文件的检查
R=p+i+n+u+g+s+m+c+md5 权限+索引节点+链接数+用户+组+大小+最后一次修
改时间+创建时间+md5校验值
NORMAL = R+rmd60+sha256
初始化默认的AIDE的库:
/usr/local/bin/aide --init
生成检查数据库(建议初始数据库存放到安全的地方)
cd /var/lib/aide
mv aide.db.new.gz aide.db.gz
检测:
/usr/local/bin/aide --check
更新数据库
aide --update

猜你喜欢

转载自blog.51cto.com/13698281/2118972