Marchan4
@Marchan4 (Marchan4)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

環境変数を使ってパスワードを設定してもrailsサーバがうまく起動しない理由を教えてください。

rubyのバージョンは3.0.0、 mysqlのバージョンは5.7、 mysql2のバージョンは0.5.3、
bundlerバージョンは2.2.3、 railsのバージョンは5.0.7.2です。

現在message-boardというアプリを作成中です。

フォルダの形式は以下のようになっております。

message-board_folder
  └message-board
  └.ruby-version

まず、

$ rails s

というコマンドでrailsを起動しようとしたところ、以下のエラーの画像が表示されました。

Action Controller_ Exception caught_page-0001(モザイクあり).jpg

Mysql2::Error::ConnectionError
Access denied for user 'root'@localhost'(using password: NO)

というエラーが表示されておるため、

database.yml
環境変数を使ったパスワードを追加いたしました。

database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: <%= ENV['DB_PASSWORD'] %>
  socket: /tmp/mysql.sock

それからターミナルに以下のコマンドを実行いたしました。

$ export DB_PASSWORD=自分のMySQLバージョン5.7のログインパスワード
$ rails s

上記のコマンド実行結果は以下の画像の通りになりました。

Action Controller_ Exception caught_page-0001(モザイクあり).jpg

上記の画像のFramework Traceの項目にある

mysql2 (0.5.3) lib/mysql2/client.rb:90:in `connect'
mysql2 (0.5.3) lib/mysql2/client.rb:90:in `initialize'
activerecord (5.0.7.2) lib/active_record/connection_adapters/mysql2_adapter.rb:25:in `new'
activerecord (5.0.7.2) lib/active_record/connection_adapters/mysql2_adapter.rb:25:in `mysql2_connection'
(...)
puma (3.12.6) lib/puma/thread_pool.rb:135:in `block in spawn_thread'

message-board_folder
  └message-board
  └.ruby-version

message-boardフォルダには存在しなかったため、エラーを解決することができませんでした。

環境変数を使ってパスワードを設定してもrailsサーバがうまく起動しない理由を教えてください。

0

1Answer

MySQL 5.7 のデフォルトではセキュリティのため、 OS 側の管理者でないと MySQL の root ユーザーにログインできないようになっていると思います。
(すでに理解していて変更済であれば、以下は無視してください)

MySQL の root ユーザーはデーターベースの管理者権限を持っているので、一般的に外部からのアクセス用には使用しません。
なぜなら、アクセスするためにはパスワードをどこかに記載しておかなくてはならず、どれだけ努力しても漏洩の可能性が存在するため、また管理者権限では漏洩した場合の影響が大きいためです。
そこで、MySQL はデフォルトでは、MySQL が動いている OS の管理者権限を持っている場合だけ、MySQL の root ユーザーにログイン可能なようにしています(いつも sudo mysql で入っていますよね?)。

対策としては以下の2つが考えられます。

  • 接続用に root 以外のユーザーを作って、それを使う
    • この場合、新しいユーザーに付与する権限は必要最小限にする
    • パスワードを漏洩しても権限は最小限のため、被害は小さくなる
  • root をパスワードでもログイン可能なように設定を変更する
    • root をパスワードでログイン可能にするのは前述のようにセキュリティ的に問題のある行為ですが、例えば閉域のお試し環境などあまりセキュリティを気にしなくてよい場合には、パスワードでログイン可能にしてしまうケースもあると思います。

もし root でもパスワードでログイン可能にしたい場合には、root で MySQL に入って、以下の2つの SQL を順番に実行することでできるようになると思います。
PASSWORD 部分は、実際のパスワードに変えて登録してください(ここで書いたパスワードで上書きしてしまいます。パスワードを変更しない場合には BY 以降は省略可能かもしれません)。
やっていることは、root ユーザーの認証方法を mysql_native_password という方法に切り替えています。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PASSWORD';
FLUSH PRIVILEGES;
0Like

Your answer might help someone💌