Linux安全出版
一.使用密鑰登錄
1.先sudo su -s 切換到root
2.生成秘鑰對
root@ubuntu:~# ssh-keygen ? 命令
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <== 按 Enter
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 直接按 Enter 留空
Enter same passphrase again: <== 回車
Your identification has been saved in /root/.ssh/id_rsa. <== 私鑰
Your public key has been saved in /root/.ssh/id_rsa.pub. <== 公鑰
The key fingerprint is:
0f:d3:e7:1a:1c:bd:5c:03:f1:19:f1:22:df:9b:cc:08 root@host
?
cd ?/root/.ssh/導出id_rsa ? 一定先導入密鑰再執行下面操作
3.服務器安裝公鑰
cd /root/.ssh/?
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
chmod 700 /root/.ssh/
?
4.設置ssh,密鑰登錄
vim /etc/ssh/sshd_config ?修改下面配置
PermitRootLogin yes
PasswordAuthentication no
?
重啟sshd
service ssh restart
?
退出shell,使用root加密鑰登錄
?
?
二.數據庫安全
2.1數據庫軟口令
face1.5.0以前的數據庫默認密碼為123456,會輕易被破解。這里介紹修改數據庫登錄密碼的方法
?
cat change_postgres_passwd.sh
#!/bin/bash
read -p "Please input your new password:" c
Passwd=$c
###.json###
sed -i "s/123456/${Passwd}/g" /home/dell/face/thor/latest/thor.json
sed -i "s/123456/${Passwd}/g" /home/dell/face/loki/latest/config/production.json
sed -i "s/123456/${Passwd}/g" /home/dell/face/loki/latest/config/default.json
sed -i "s/123456/${Passwd}/g" /home/dell/face/face-api/latest/config.json
###.txt###
sed -i "s/123456/${Passwd}/g" /home/dell/face/croatia/latest/config/croatia_config.txt
sed -i "s/123456/${Passwd}/g" /home/dell/face/bingo/latest/tmp/bingoconfig_white.txt
sed -i "s/123456/${Passwd}/g" /home/dell/face/bingo/latest/tmp/bingoconfig.txt
###登錄數據庫修改密碼
sudo -u postgres psql? -U postgres -w -c "alter user postgres with password '${Passwd}'"
supervisorctl restart all
?
?
bash chang_postgres_passwd.sh ? //輸入你的密碼
?
?
上面的腳本可以修改face1.4.2的數據庫密碼,密碼應有特殊字符,字母大小寫和數字
?
?
2.2數據庫訪問授權限制
在pg_hba.conf文件中,每條記錄占一行,指定一條訪問認證規則。
總的來說訪問控制記錄大致有以下7種形式:
local????? database? user? auth-method? [auth-options]
host?????? database? user? address? auth-method? [auth-options]
hostssl??? database? user? address? auth-method? [auth-options]
hostnossl? database? user? address? auth-method? [auth-options]
host?????? database? user? IP-address? IP-mask? auth-method? [auth-options]
hostssl??? database? user? IP-address? IP-mask? auth-method? [auth-options]
hostnossl? database? user? IP-address? IP-mask? auth-method? [auth-options]
?
?
連接方式(type)
連接方式有四種:local 、host、hostssl、hostnossl
local
這條記錄匹配通過 Unix 域套接字進行的聯接企圖, 沒有這種類型的記錄,就不允許 Unix 域套接字的聯接。
host
這條記錄匹配通過TCP/IP網絡進行的聯接嘗試.他既匹配通過ssl方式的連接,也匹配通過非ssl方式的連接。
注意:要使用該選項你要在postgresql.conf文件里設置listen_address選項,不在listen_address里的IP地址是無法匹配到的。因為默認的行為是只在localhost上監聽本地連接。
hostssl
這條記錄匹配通過在TCP/IP上進行的SSL聯接企圖。
要使用該選項,服務器編譯時必須使用--with-openssl選項,并且在服務器啟動時ssl設置是打開的
hostnossl
這個和上面的hostssl相反,只匹配通過在TCP/IP上進行的非SSL聯接企圖。
數據庫(database)
聲明記錄所匹配的數據庫。
值 all 表明該記錄匹配所有數據庫;
值 sameuser表示如果被請求的數據庫和請求的用戶同名,則匹配;
值samegroup 表示請求的用戶必須是一個與數據庫同名的組中的成員;
值 replication 表示匹配一條replication連接,它不指定一個特定的數據庫,一般在流復制中使用;
在其他情況里,這就是一個特定的 PostgreSQL 數據庫的名字。 我們可以通過用逗號分隔的方法聲明多個數據庫。 一個包含數據庫名的文件可以通過對該文件前綴 @ 來聲明.該文件必需和 pg_hba.conf 在同一個目錄。
?
用戶名(user)
為這條記錄聲明所匹配的 PostgreSQL 用戶,值 all 表明它匹配 于所有用戶。否則,它就是特定 PostgreSQL 用戶的名字,多個用戶名可以通過用逗號分隔的方法聲明,在名字前面加上+代表匹配該用戶組的所有用戶。一個包含用戶名的文件可以 通過在文件名前面前綴 @ 來聲明,該文件必需和 pg_hba.conf 在同一個目錄。
?
主機地址(address)
指定匹配的客戶端的地址,它可以是一個主機名,一個IP地址范圍,或者下面提到的這些選項。
一個IP地址范圍是一個標準的點分十進制表示的 IP地址/掩碼值。注意, 在'IP地址','/'和'掩碼值'之間不要有任何的空白字符。
比如對于IPv4地址來說, 192.168.2.66/32指定單個主機的IP,192.168.2.0/24代表一個小的子網。對于IPv6地址來說,::1/128指定單個主機(這里是本機環回地址),fe80::7a31:c1ff:0000:0000/96 指定一個IPv6的子網。0.0.0.0/0代表所有IPv4地址,::0/0代表所有IPv6地址。
一個IPv4地址選項只能匹配IPv4地址,一個IPv6地址選項只能匹配IPv6地址,即使給出的地址選項在IPV4和IPv6中同時存在。
當然你可以使用 all 選項來匹配所有的IP地址,使用 samehost 匹配服務器自己所有的IP地址,samenet來匹配服務器直接接入的子網。
如果指定的是主機名(既不是IP地址也不是上面提到的選項),這個主機名將會和發起連接請求的客戶端的IP地址的反向名稱解析結果(即通過客戶端的IP解析其主機名,比如使用反向DNS查找)進行比對,如果存在匹配,再使用正向名稱解析(例如DNS查找)將主機名解析為IP地址(可能有多個IP地址),再判斷客戶端的IP地址是否在這些IP地址中。如果正向和反向解析都成功匹配,那么就真正匹配這個地址(所以在pg_nba.conf文件里的主機地址必須是客戶端IP的 address-to-name 解析返回的那個主機名。一些主機名數據庫允許將一個IP地址和多個主機名綁定,但是在解析IP地址時,操作系統只會返回一個主機名)。
有些主機名以點(.)開頭,匹配那些具有相同后綴的主機名,比如.example.com匹配foo.example.com(當然不僅僅只匹配foo.example.com)。
還有,在pg_hba.conf文件中使用主機名的時候,你最好能保證主機名的解析比較快,一個好的建議就是建立一個本地的域名解析緩存(比如nscd)。
本選項只能在連接方式是host,hostssl或者hostnossl的時候指定。
ip地址(ip-address)、子網掩碼(ip-mask)
這兩個字段包含可以看成是標準點分十進制表示的 IP地址/掩碼值的一個替代。例如。使用255.255.255.0 代表一個24位的子網掩碼。它們倆放在一起,聲明了這條記錄匹配的客戶機的 IP 地址或者一個IP地址范圍。本選項只能在連接方式是host,hostssl或者hostnossl的時候指定。
?
認證方法(authentication method)
trust
無條件地允許聯接,這個方法允許任何可以與PostgreSQL 數據庫聯接的用戶以他們期望的任意 PostgreSQL 數據庫用戶身份進行聯接,而不需要口令。
reject
聯接無條件拒絕,常用于從一個組中"過濾"某些主機。
md5
要求客戶端提供一個 MD5 加密的口令進行認證,這個方法是允許加密口令存儲在pg_shadow里的唯一的一個方法。
password
和"md5"一樣,但是口令是以明文形式在網絡上傳遞的,我們不應該在不安全的網絡上使用這個方式。
gss
使用GSSAPI認證用戶,這只適用于 TCP/IP 連接。
sspi
使用SSPI認證用戶,這只適用于 Windows 連接。
peer
獲取客戶端的操作系統的用戶名并判斷他是否匹配請求的數據庫名,這只適用于本地連接。
ldap
使用LDAP服務進行驗證。
radius
使用RADIUS服務進行驗證。
cert
使用SSL服務進行驗證。
pam
使用操作系統提供的可插入的認證模塊服務 (Pluggable Authentication Modules)(PAM)來認證。
?
?
注意:防止數據庫被惡心修改配置文件,需對pg_hba.conf加i鎖
chattr +i /etc/postgresql/9.6/main/pg_hba.conf ?#禁止任何人修改數據庫認證文件
chattr +a ?/data/postgresql ? #禁止任何人修改數據目錄權限
?
2.3數據庫防火墻配置
192.168.2.0/24表示一個網段
ufw allow from 192.168.2.0/24 to any port 5432
?
?
三、redis安全
1.口令登錄
vim /home/dell/gas/redis/latest/conf/redis.conf
#包含通用配置?
include? conf/redis-common.conf
#綁定IP
bind 0.0.0.0
#監聽tcp端口?
port 6379
#最大可用內存?
maxmemory 4g
#內存耗盡時采用的淘汰策略:?
# volatile-lru -> remove the key with an expire set using an LRU algorithm?
# allkeys-lru -> remove any key accordingly to the LRU algorithm?
# volatile-random -> remove a random key with an expire set?
# allkeys-random -> remove a random key, any key?
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)?
# noeviction -> don't expire at all, just return an error on write operations?
maxmemory-policy volatile-lru
#aof存儲文件?
#appendfilename "appendonly-6379.aof"?
#rdb文件,只用于動態添加slave過程?
#dbfilename dump-6379.rdb?
#cluster配置文件(啟動自動生成)?
cluster-config-file nodes-6379.conf
#部署在同一機器的redis實例,把<span style="font-size: 1em; line-height: 1.5;">auto-aof-rewrite搓開,防止瞬間fork所有redis進程做rewrite,占用大量內存</span>?
#auto-aof-rewrite-percentage 80-100
appendonly no
#save 900 1
rename-command FLUSHALL ""??
requirepass asgard@1939? //設置redis認證,目前不支持,需要研發提供對應的服務
?
2.2避免端口暴露在網絡中
vim /home/dell/gas/redis/latest/conf/redis.conf
?
#包含通用配置?
include? conf/redis-common.conf
#綁定IP
bind 127.0.0.1 //注意修改了監聽IP后,程序中的連接redis IP也需要修改,如arcee,thor,supmylo等
#監聽tcp端口?
port 6379
#最大可用內存?
maxmemory 4g
#內存耗盡時采用的淘汰策略:?
# volatile-lru -> remove the key with an expire set using an LRU algorithm?
# allkeys-lru -> remove any key accordingly to the LRU algorithm?
# volatile-random -> remove a random key with an expire set?
# allkeys-random -> remove a random key, any key?
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)?
# noeviction -> don't expire at all, just return an error on write operations?
maxmemory-policy volatile-lru
#aof存儲文件?
#appendfilename "appendonly-6379.aof"?
#rdb文件,只用于動態添加slave過程?
#dbfilename dump-6379.rdb?
#cluster配置文件(啟動自動生成)?
cluster-config-file nodes-6379.conf
#部署在同一機器的redis實例,把<span style="font-size: 1em; line-height: 1.5;">auto-aof-rewrite搓開,防止瞬間fork所有redis進程做rewrite,占用大量內存</span>?
#auto-aof-rewrite-percentage 80-100
appendonly no
#save 900 1
rename-command FLUSHALL ""??
requirepass asgard@1939
?
2.3 重命名關鍵命令進行加固
由于redis沒有做基本的權限分離,沒有管理賬號、普通賬戶之分,所以登錄之后無操作權限限制,因此需要將一些危險的操作隱藏起來,涉及的命令包括:
FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME, DEBUG, EVAL
修改redis.conf,添加下列命令,禁用高危命令
rename-command FLUSHALL ""
rename-command CONFIG?? ""
rename-command EVAL???? ""
rename-command shutdown???? ""
rename-command FLUSHDB???? ""
?
?
2.4 低權限賬戶
設置單獨的redis賬戶運行redis,redis crackit漏洞就利用root用戶的特性來重置authorized_keys從而達到控制系統主機的目的,使用普通帳號運行redis可以降低被利用的風險,如下:
創建一個redis賬戶,然后通過該賬戶啟動redis,命令如下:
useradd redis -s /sbin/nolgin ?##創建不可登錄的用戶
vim /etc/supervisor/conf.d/redis.conf
[program:redis]
command=/bin/bash sv_start.sh conf/redis.conf
process_name=%(program_name)s
numprocs=1
directory=/home/dell/face/redis/latest
;umask=022
priority=700
autostart=true
autorestart=true
;startsecs=3
startretries=3
exitcodes=0,2
;stopsignal=TERM
stopwaitsecs=5
stopasgroup=true
killasgroup=true
user=redis?? //使用redis用戶啟動任務
redirect_stderr=true
stdout_logfile=/home/dell/data/logs/%(program_name)s.log
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=5
?
supervisorctl update?????? //更新配置
?
?
?
redis附錄:
配置文件中指定redis淘汰策略
redis提供的淘汰策略:
?
noeviction:達到內存限額后返回錯誤,客戶嘗試可以導致更多內存使用的命令(大部分寫命令,但DEL和一些例外)
allkeys-lru:為了給新增加的數據騰出空間,驅逐鍵先試圖移除一部分最近使用較少的(LRC)。
volatile-lru:為了給新增加的數據騰出空間,驅逐鍵先試圖移除一部分最近使用較少的(LRC),但只限于過期設置鍵。
allkeys-random: 為了給新增加的數據騰出空間,驅逐任意鍵
volatile-random: 為了給新增加的數據騰出空間,驅逐任意鍵,但只限于有過期設置的驅逐鍵。
volatile-ttl: 為了給新增加的數據騰出空間,驅逐鍵只有秘鑰過期設置,并且首先嘗試縮短存活時間的驅逐鍵
?
?
四、防止ddos攻擊
簡易的防止ddos腳本
?
ufw enable??? //先開啟ufw
vim ddos.sh
#!/bin/bash
head=`netstat -an? | grep ESTABLISHED? |awk? '{print $5}'|awk -F':' '{print $1}' |uniq? -c |sort -nr |head -1`? ##取建立連接做多的IP
head_ip_num=`echo $head|awk? '{print $1}'`? ##取建立連接做多的IP的數量
head_ip=`echo $head|awk? '{print $2}'`?????????????? ##取建立連接做多的IP
if [[ $head_ip_num -gt 200]]???? ##判斷IP出現次數有沒有200
then
????? ??ufw deny from $head_ip to any? ##超過200,禁止此IP訪問
else
??????? echo "$head_ip 出現次數較多請注意"? ##小于200,提醒
fi
?
bash ddos.sh??? ##執行腳本
?
?
轉載于:https://www.cnblogs.com/pengjihao/p/11092095.html
總結
- 上一篇: 请你讲一讲JavaScript有哪些数据
- 下一篇: 小程序中使用threejs