加密和安全初解

安全機制

信息安全防護的目標
保密性 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#客戶端執行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章