2018年4月3日 星期二

VSFTPD的安全性設定


更新:為了符合PCI DSS的要求,通訊協定只能支援TLS 1.2以上版本,須把ssl_ciphers設定為TLSv1.2,參考來源



這年頭還會用FTP服務就是為了滿足B to B的需求吧…。


chroot_local_user=YES
#把使用者關在自己的家目錄
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
#ssl金鑰一般用自我產生的就好了,長度至少要在2048bit以上
ssl_enable=YES
#啟用FTP over TLS/SSL
ssl_ciphers=HIGH
#加密演算法使用HIGH,演算法是128位元以上的都會使用,這裡也可以自訂想要使用的加密演算法。
implicit_ssl=YES
#預設值是NO,使用FTPES,啟用此選項會改成FTPS
pasv_min_port=30000
pasv_max_port=31000
#明確指定pasv模式使用的port範圍,比較容易設定防火牆

強制開啟FTP over TLS/SSL後,有時會很難做troubleshooting,建議可以先關掉,然後就會出現明確的錯誤訊息。

啟用chroot_local_user後用Filezilla去連,會出現ssl交握錯誤這種不明確的訊息,但是把ssl模式關閉後,就會出現500 OOPS: vsftpd: refusing to run with writable root inside chroot()這樣的訊息。

關於500 OOPS: vsftpd: refusing to run with writable root inside chroot()這個錯誤,網路上大多數的解法都是在設定檔加上allow_writeable_chroot=YES這個設定,但是這個作法有潛在安全性問題,所以後面的版本就把這個設定拿掉,在manpage裡頭也看不到此設定選項的說明。(經實測Debian 9的vsftpd有此選項,但是manpage裡頭一樣看不到)正確的作法是把使用者家目錄的寫入權限拿掉,在新增使用者後在使用者的家目錄中設置一個上傳專用的目錄。

2018年1月12日 星期五

使用Redis之後碰到的一些地雷雷雷...(Orz

最近開始嘗試使用Redis Sentinel建置高可用性服務,在測試的時候碰到一些問題。我在一個由三個Redis實體組成的Master-Slave Cluster倒入約4GB的資料,然後在Master下KEYS *把所有鍵列出來,沒過幾秒在Sentinel出現Master down然後重新推舉Master的訊息。

我在Sentinel裡頭設定Master在5秒內無回應就會判定為down,那也就是說我做了列出所有鍵的操作阻擋了後續所有連線的作業,這是怎麼回事?

回想一下Redis的特性,大概是:
  • 單執行緒、單行程
  • 所有操作是以atomic方式進行,因此確保了資料的一致性
  • 雖然運作時資料是存放於記憶體中,但是可回存為檔案,確保資料的持久性
  • 因為資料是存放於記憶體,所以速度很快
Redis不像一般的RDBMS有實做Transaction Isolation,任何操作都要等到前一個操作執行完才會進行,無法平行處理,Redis才能保證資料的一致性。因此非常不適合使用Redis進行以下操作:
  • 列出所有鍵:KEYS *
    如果存入的鍵很多,就得花很多時間處理。以我測試的情況,4GB的資料有將近1500萬個鍵,列出操作就花了183秒。
  • 搜尋特定鍵:KEYS *name*
    跟前一個是同樣的情況,列出了154個卻花了9秒多來處理。
我本職是系統管理者不是程式開發人員,所以有可能有其他的情況不適合使用Redis。如果要更有效率的使用Redis,那就盡量不要使用KEYS指令來列出或搜尋鍵。

2017年12月13日 星期三

GCE的TCP Health Check不支援換行符號

我打算在Google Compute Engine上建置Redis Slave個體群組,並使用GCP的負載平衡服務來連接,但是碰到一個問題,Health Check永遠都是失敗,導致個體群組裡頭的VM一直被重建。

檢查了許多地方,確認Health Check的IP可以連進VM,從netstat -an也可以看到連線。使用nc -l -p 6379的確也能看到Health Check送進來的要求字串 PING\r\n,但是透過redis-cli下monitor指令卻沒看到。

我在Health Check設置的要求字串是 PING\r\n,檢查字串是 +PONG,用nc的確是看到傳進來的是PING\r\n....等等,換行字元應該不會顯示?然後又用PYTHON參考別人寫的範例做了一個TCP SOCKET SERVER,結果顯示出來的是 PING\\r\\n...... Orz。redis一定要接收到換行符號才算接收到指令,否則就會停在那裡。看起來GCE的Health Check會過濾特殊符號。

Google Groups上的GCE論壇也有人有相同的問題,Google的人回答都指向stackoverflow上的某個連結:
https://stackoverflow.com/questions/43228878/health-check-to-detect-redis-master-from-google-tcp-load-balancer
下面回答得很長,其實結論是在同一台VM裡頭去跑另一隻程式來處理Health Check請求與回傳結果,我最後是用PYTHON寫了一個TCP SOCKET SERVER,當Health Check傳入PING,就使用subprocess去跑redis-cli PING,然後把結果回傳。


2017年12月11日 星期一

在mora.jp買音樂

最近在玩人中之龍 極2的酒店經營部份,在編輯酒店小姐的裝扮時,總是會播放歌曲『As You Like』,還蠻好聽的。這首歌曲有收錄在 人中之龍 零 OST Side A 裡,查了一下只能買CD或者數位檔案,像KKBOX跟Spotify都沒有提供。整張專輯(Side A)要1500日圓,可是我只對這首歌有興趣,搜尋一下發現mora.jp有在賣單一曲目,便想試看看購買,果然一按下結帳就出現不開放日本以外購買的警告。

不過最後我還是購買成功了,我使用了以下的步驟:
  1. 把瀏覽器的語言改成日文優先(這個可能不需要)
  2. 使用日本的IP進入mora.jp(VPN)
  3. 付款方式使用Amazon Pay(需要有日本Amazon帳號)
我就是這樣購買並成功下載,其他的支付方式都需要日本當地的地址,不太可能成功。

2017年11月11日 星期六

UAP接在MikroTik RB750Gr3後無法透過DHCP獲得IP的問題

最近借到一台RB750Gr3,想要取代我原本使用的ASUS RTN-56U。我的無線網路是使用UniFi UAP AC Lite。把RB750設置好之後,把UAP接上去卻發現手機平板都無法連接上,UniFi Controller也顯示adoption failed,而UAP的IP也跟DHCP設置的網段不同。

花了些時間搜尋資訊,發現三月就有人碰到同樣的問題,解法是在RouterOS的橋接設定,把STP改成none。
https://forum.mikrotik.com/viewtopic.php?t=116963&start=50