加密和安全初解
信息安全防護的目標
保密性 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) 在客戶端生成密鑰對
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
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
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: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#客戶端執行
加密和安全初解