Redis NOAUTH Authentication required エラーの修正方法

beginner🔴 Redis2026-03-18| Linux、macOS、Windows上のRedis 4+、すべてのRedisクライアント(redis-cli、redis-py、ioredis、node_redis)

Error Message

NOAUTH Authentication required
#redis#auth#password#requirepass

エラーの内容

NOAUTH Authentication required

パスワードが設定されているRedisインスタンスで、認証を行わずにコマンドを実行した瞬間にこのエラーが発生します。典型的な例として、redis-cliを開いてSET key valueと入力すると、Redisは即座に拒否します。

発生原因

redis.confrequirepassを設定すると、Redisはすべてのアクセスをロックします。クライアントは他のコマンドを受け付けてもらう前にAUTH <password>を実行する必要があります。PINGも例外ではありません。

よくある原因:

  • -aフラグや接続後のAUTHコマンドなしでredis-cliに接続している
  • アプリの設定にパスワードが設定されていない、またはローテーション後に古いパスワードが残っている
  • redis.confrequirepassを追加してRedisを再起動したが、アプリの設定を更新していない
  • マネージドRedis(Redis Cloud、AWS ElastiCache、Upstash)では認証が必須

修正1:redis-cliで認証する

方法A:接続時にパスワードを指定する

redis-cli -h 127.0.0.1 -p 6379 -a yourpassword

方法B:接続後に認証する

redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> AUTH yourpassword
OK
127.0.0.1:6379> PING
PONG

AUTHOKを返すと、そのセッション内の後続コマンドはすべて通ります。認証は接続ごとに1回だけ行えば十分です。

修正2:アプリケーションの接続設定を修正する

アプリでNOAUTHが発生している場合、Redisクライアントが認証情報を送信していません。接続設定にパスワードを追加してください:

Python (redis-py)

import redis

r = redis.Redis(
    host='127.0.0.1',
    port=6379,
    password='yourpassword',
    decode_responses=True
)
r.ping()  # 認証が成功するとTrueを返す

Node.js (ioredis)

const Redis = require('ioredis');

const redis = new Redis({
  host: '127.0.0.1',
  port: 6379,
  password: 'yourpassword',
});

redis.ping().then(result => console.log(result)); // PONG

Node.js (node_redis v4)

import { createClient } from 'redis';

const client = createClient({
  url: 'redis://:yourpassword@127.0.0.1:6379'
});
await client.connect();

接続URLを使用する(推奨)

# .env
REDIS_URL=redis://:yourpassword@127.0.0.1:6379

ほとんどのRedisクライアントは、パスワードが埋め込まれた完全なURLを受け入れます。2つのメリットがあります:ソースコードにシークレットを含めずに済み、パスワードのローテーションは環境変数を1つ更新するだけで完了します。

修正3:パスワードを無効化する(開発環境のみ)

ローカル開発環境で認証が不要な場合は、ファイルを変更せずにランタイムで無効化できます:

# 実行中のインスタンスで認証を無効化する(現在のパスワードが必要)
redis-cli -a currentpassword CONFIG SET requirepass ""

# または現在の設定を確認する
redis-cli -a currentpassword CONFIG GET requirepass

ファイルを直接編集する場合は、/etc/redis/redis.confを開いて以下の行をコメントアウトしてください:

# requirepass yourpassword

その後、再起動します:

sudo systemctl restart redis
# または古いシステムの場合
sudo service redis-server restart

本番環境やインターネットに公開されているサーバーでは絶対に行わないでください。

修正4:現在のパスワードがわからない場合

他の人がパスワードを設定した場合は、設定ファイルを確認してください。ほぼ必ず平文で記載されています:

grep requirepass /etc/redis/redis.conf
# またはすべての設定ファイルを検索する
sudo grep requirepass /etc/redis/*.conf

それでも見つからない場合は、起動時にパスワードが渡されていないか確認してください:

ps aux | grep redis-server
# 出力の中に--requirepassがあるか確認する

どうしても回復できない場合は、サーバーにアクセスして新しい設定でRedisを再起動する必要があります。

修正の確認

redis-cli -a yourpassword PING
# 期待される結果: PONG

redis-cli -a yourpassword SET testkey "hello"
# 期待される結果: OK

redis-cli -a yourpassword GET testkey
# 期待される結果: "hello"

# クリーンアップ
redis-cli -a yourpassword DEL testkey

PINGでPONGが返り、SET/GETが正常に動作していれば修正完了です。

ヒント

長いランダムなパスワードを使用する

Redisは1秒あたり数十万の操作を処理できます。AUTHリクエストも同様です。短いパスワードはインターネットに公開されたインスタンスでは深刻なリスクになります。32文字以上の英数字の文字列を生成してください。私はこのためにToolCraftのパスワードジェネレーターを使用しています。英数字のみにしてください:特殊文字はredis-cliにパスワードを渡す際にシェルエスケープの問題を引き起こします。

環境変数でパスワードを設定する

# docker-compose.yml
services:
  redis:
    image: redis:7-alpine
    command: redis-server --requirepass ${REDIS_PASSWORD}
    environment:
      - REDIS_PASSWORD=${REDIS_PASSWORD}

Redis 6+ ACLシステム

requirepassはRedis 6+でも動作しますが、複数のサービスが1つのインスタンスを共有する場合はACLシステムへの移行を検討する価値があります。ユーザーごとのパスワード、詳細なコマンド権限など、より細かい制御が可能です:

# 専用のアプリユーザーを作成する
ACL SETUSER appuser on >yourpassword ~* &* +@all

# そのユーザーで接続する
AUTH appuser yourpassword

マネージドRedisの接続文字列

Redis Cloud、Upstash、ElastiCacheはすべてダッシュボードから接続URLを提供しており、パスワードが既に埋め込まれています。そのままコピーして使用してください:

redis://:password@your-host.example.com:6379
# TLS(Upstash、Redis Cloud)
rediss://:password@your-host.example.com:6380

Related Error Notes