安全相关

post thumb
Safe
作者 Louis 发表于 2018年6月6日

摘要:安全机制,openssl,基于key的验证,CA证书,pssh,AIDE简介, ssh端口转发

安全机制

信息安全防护的目标

  • 保密性 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  #解密
]$  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

服务器192.168.1.8上生成私钥,配置文件如下

]$  vim /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

]$  cd /etc/pki/CA
]$  (umask 077;openssl genrsa -out private/cakey.pem 4096 )
]$  tree 
]$  openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
 	Country Name (2 letter code) [XX]:CN
    State or Province Name (full name) []:beijing
    Locality Name (eg, city) [Default City]:beijing
    Organization Name (eg, company) [Default Company Ltd]:test
    Organizational Unit Name (eg, section) []:opt
    Common Name (eg, your name or your server's hostname) []:ca.test.com
]$  cat cacert.pem 
#不同形式查看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.生成私钥及证书申请文件

服务器或用户申请证书,并将申请发送至rootCA

]$  (umask 077;openssl genrsa -out app.key 1024) 
]$  openssl req -new -key app.key -out app.scr
 	Country Name (2 letter code) [XX]:CN
    State or Province Name (full name) []:beijing
    Locality Name (eg, city) [Default City]:beijing
    Organization Name (eg, company) [Default Company Ltd]:test
    Organizational Unit Name (eg, section) []:opt
    Common Name (eg, your name or your server's hostname) []:ca.testuser.com
]$  scp app.scr 192.168.1.8:/etc/pki/CA

4.CA颁发证书,并回传证书

]$  cd /etc/pki/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. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

基于key密钥的认证:

(1) 在客户端生成密钥对

ssh-keygen -t rsa [-P ''] [-f “~/.ssh/id_rsa"]

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

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

(3) 测试

(4) 在SecureCRTXshell实现基于key验证

SecureCRT工具—>创建公钥—>生成Identity.pub文件转化为openssh兼容格式(适合SecureCRTXshell不需要转化格式),并复制到需登录主机上相应文件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
]$  vim sshkey.sh
#!/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

tcp_wapper 实现安全控制

实现主机的访问控制。

客户端Client_list格式

以逗号或空格分隔的客户端列表

基于IP地址:192.168.10.1 192.168.1.32

基于主机名: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

日志功能

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,以密文形式建立每个文件的校验码或散列号.

aide的安装

]$  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库

初始化默认的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

pssh

pssh是一个python编写可以在多台服务器上执行命令的工具,也可实现文件copy

 --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:192.168.30.6   telnetsrv:192.168.30.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
]$  cd dropbear-2018.76
]$  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

运行dropbear

]$  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#客户端执行
上一篇
Ansible简单实验

文章推荐