cacti如何取得啟用認證機制的redis狀態

去年導入一個新專案時,因考量需要比key:value更複雜的模式,最後捨棄常用的memcache改用redis這套nosql。

和memcache相比,redis無論是功能、相關設定與需要注意的事項都複雜很多。

當初導入redis時,就曾考慮是否需要啟用其認證機制。但只要多花點時間瞭解redis的架構,不經讓人覺得redis的認證機制有點雞肋而暫時不啟用。

畢竟redis是單執行緒(Redis is single threaded),因此無法做延遲的處理。加上redis號稱每秒可處理500k的request,如果有心人士利用暴力法,應該不難打出密碼。

設定的重點,應該是啟動服務時不使用root,並設定好網路環境,避免外部可直接存取、及變更重要指令的名子等等…。

雖然說覺得redis認證機制雞肋,但最後考量能多層保護就多一層保護,最近還是調整設定、與程式,啟用了認證機制。

沒想到,cacti就無法正常取得redis的狀態了……

cacti取得redis狀態,我是使用percona-monitoring-plugins。他的程式(ss_get_by_ssh.php)沒有支援輸入redis auth的參數,所以……只好調整程式了……

該程式呼叫redis_get()使用INFO指令去取得redis狀態,因此就在此處動手腳,增加以下程式傳入AUTH指令、以及密碼。
$res = fwrite($sock, 'AUTH myredispassword'."\r\n");
沒想到,cacti依舊無法取得redis狀態。只好開啟該程式的debug log查看原因…
$debug_log = '/yourlogpath/debug.log';

觀察debug log,發現redis居然只有收到AUTH指令,卻沒有收到傳過去的密碼,真奇怪~
2016-06-21 20:46:43 ss_get_by_ssh() at /cacti/scripts/ss_get_by_ssh.php:301
'redis_get() is defined, will call it'
2016-06-21 20:46:43 ss_get_by_ssh() at /cacti/scripts/ss_get_by_ssh.php:311
'-ERR Client sent AUTH, but no password is set

最後,把程式調整成以下作法,cacti終於可正常取得redis狀態
$res = fwrite($sock, 'AUTH ');
$res = fwrite($sock, "myredispassword\r\n");

參考資料

  1. Redis Security – Redis
  2. INFO – Redis
  3. percona-monitoring-plugins

留言