質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.64%

redis dirおよびdbfilenameの値が勝手に書き換えられる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,995

H.Maseda

score 5

 前提・実現したいこと

複数のウェブサーバ(CentOS7, nginx使用)で負荷分散およびセッション同期を
実現したいと考えています。

 発生している問題・エラーメッセージ

redisを使用してセッション同期をしていますが、頻繁に同期が取れなくなります。
/var/log/redis/redis.logには以下のようなエラーが表示されます。(タイムスタンプ等省略)

10 changes in 300 seconds. Saving...
Background saving started by pid xxxxx
Failed opening the RDB file root (in server root dir /etc/cron.d) for saving: Permission denied
Background saving error

このログの例では
dir:/var/lib/redis→/etc/cron.d
dbfilename:dump.rdb→root
に書き換えられています。書き換えられる値は上記に限りませんが
dirがroot権限のディレクトリに書き換えられてしまうとredis ID
がRDBファイルを書き込めなくなりこのエラーになっているようです。

 該当のソースコード

ソースコード

 試したこと

現状ではredis-cliコマンドを使用してdirおよびdbfilenameの
値が/var/lib/redisおよびdump.rdb以外に書き換えられていたら
デフォルトに戻すツールを作成し、crontabで5分毎に実行する
ということで、エラーを抑止しています。
なぜこのような状況が発生し、どうすれば解決できるのか
ご教授いただけないかと考えます。
よろしくお願いいたします。

 補足情報(FW/ツールのバージョンなど)

redis.confの修正について(マスター、スレーブ×1)

bind 127.0.0.1→#bind 127.0.0.1
protected-mode yes→protected-mode no
timeout 0→timeout 60
tcp-keepalive 300→tcp-keepalived 0
stop-writes-on-bgsave-error yes→stop-writes-on-bgsave-error no
↑変更した記憶がないのでredisが自分で変更したのではないかと(かつ2台中マスター側のみ)
slave-read-only yes→slave-read-only no
slaveof (スレーブ側のみ)

redis-sentinel.confの設定について(redisとは別サーバ×1)

protected-mode no
daemonize no
sentinel monitor redis_www_session (マスターIP) 6379 1
sentinel down-after-milliseconds redis_www_session 3000

 Generated by CONFIG REWRITE

sentinel failover-timeout redis_www_session 90000
sentinel known-slave redis_www_session (スレーブIP) 6379

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hichon

    2018/02/14 17:25

    redis-serverを引数無しで起動すると、redis.confが読み込まれず、dump.rdsの保存先がカレントディレクトリになりますが、そういう処理が何処かで行われていませんか?

    キャンセル

  • H.Maseda

    2018/02/14 17:51

    redis-server起動時の引数の有無は分かりませんが、ps -ef | grep redisの結果が/usr/bin/redis-server *:6379となっているので、引数有ではないかと思います。

    キャンセル

  • H.Maseda

    2018/02/16 17:33

    /usr/lib/systemd/system/redis.serviceを参照したところExecStart=/usr/bin/redis-server /etc/redis.conf --daemonize noとありましたのでredis.confは読み込まれていると考えます。

    キャンセル

回答 2

checkベストアンサー

+2

redis はネットに公開された場所で稼働されてますか?
(ウェブサーバと同じサーバとか)

補足に bind 127.0.0.1→#bind 127.0.0.1 とあるので、気になりました。

bind は redis に接続できるサーバのIP(ローカルIP)を指定するものです。

コメントアウトしてしまうと全解放となるので、もしネット公開されていれば
どこのサーバからでも接続でき、データ取得・更新、停止・再起動までできてしまいます。

危険です。

https://github.com/kurosawatsuyoshi/doshelper/wiki/1.-redis-Setup%EF%BC%88redis%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%EF%BC%89
の Appendix に記載した crackit/crack@redis.io をみてもらえばわかると思います。

redis-cli で config get bind と打ったらどうなりますか?

もし閉じた環境であったり、 iptables で制御していれば大丈夫です。

ただ、、、 dir とか dnfilename は勝手に変わらないので誰かが外から変更しているように見えますね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/15 09:35

    回答ありがとうございました。
    たまたま昨日redisのポートがローカルIPだけでなくグローバルIPにも
    開放されていることに気づいて、ローカルIP専用のゾーンを作成し
    ゾーン内のみ開放するよう設定変更したところでした。
    kurosawa様の回答でこの設定変更で正しいという確証が得られました。
    あらためてありがとうございました。

    キャンセル

  • 2018/03/15 16:55

    原因がわかって良かったです。

    ただ、これまで外部公開されていたということになると
    イタズラや攻撃目的でサーバに侵入されていないか確認したほうが良いです

    私が実際に redis を利用して攻撃されました。
    (それが紹介した記事です)

    redisのDirやdbfilenameを ssh 鍵の内容とパスに変更され、save コマンドでファイルを作成して shutdown されてました。

    管理者の私はredisが落ちたことに気づき再起動させますが、この段階では redisは設定ファイルからDirとdbfilenameを読み込むので、変更されてファイル作成されたことに気づきません。(たまたま再起動前に気づいたので即除去しました)

    今回は root というファイルを cron.d にセットする過程に見えます。

    既に外部から怪しい実行ファイルが配置され、それを定期的にキックしようと試みていたが、たまたま redis を起動しているユーザが root じゃなかったため配置に失敗していただけ。という見方もできます。

    念のため、以下を確認したほうが良いです

    ・不明なOSユーザが登録してないか
    ・全員のsshキーが改ざんされていないか
    ・Redisのキー&バリューに変な値がないか(16個のDBすべて)

    私ならパスワードの全変更とログ調査に取り掛かります

    キャンセル

0

めちゃくちゃ助かった。ありがとう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる