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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2743閲覧

MySQLパスワード等のコード内での管理方法について

sakamata

総合スコア203

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

3クリップ

投稿2017/12/19 06:16

MySQL PHP Apache の構成でWebアプリを作っています。

パーフェクトPHPの本にあった独自のフレームワークを使用しているのですが、
アプリケーション起動時にMySQLのパスワード等各種設定を以下の様にしてありました。

php

1 $this->db_manager->connect('master', array( 2 'dsn' => 'mysql:dbname=my_db;host=localhost', 3 'user' => 'root', 4 'password' => 'mypassword', 5 ));

上記の様にcode内に直接パスワードをが記載されると誤って公開Git等に上がると危険である事、
また、環境毎に設定の変更が必要な為、このように改修してみました。

php

1 $this->db_manager->connect('master', array( 2 'dsn' => $_SERVER['SQL_DNS'], 3 'user' => $_SERVER['SQL_USER'], 4 'password' => $_SERVER['SQL_PASS'], 5 ));```

つまり http.conf の環境変数に MySQLのパスワード等を設定したのですが、これはセキュリティ上危険でしょうか?

一応、ソースコード内に phpinfo() 等が入らない様にして、環境変数が漏れないよう管理はしておりますが、このほかに良い方法があれば、教えてくださると助かります。

一応、自分では

php

1require "../../secret.php";

という様に非公開フォルダにパスワードだけ変数指定したファイルを読み込ませる、等も過去行ったのですが、フレームワーク自体の使い方が甘く、至る所で require が必要になってしまい辞めた経験があります。
またrequireをするにも、公開ファイル内に記載し、 .gitignore を使って該当ファイルのみは別で管理するという方法もありそうですが、管理している存在自体を忘れそうでこれも採用しませんでした。

つきましては一般的なcode内のパスワード管理方法について教えてくだされば幸いです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

つまり http.conf の環境変数に MySQLのパスワード等を設定したのですが、これはセキュリティ上危険でしょうか?

良い案の一つだと思いますよ。
ただし、MySQLのパスワードをApacheが知ってるってのは微妙な気もしますね。
例えばバーチャルドメインで複数サービスを立ち上げるようなケースでは干渉するかもしれないので、気をつけてください。

まぁ、何かしらのファイルにMySQLのパスワード等の情報が載るので、
どうやって管理するべきかに関しては答えがないものとなります。


上記の様にcode内に直接パスワードをが記載されると誤って公開Git等に上がると危険である事、

また、環境毎に設定の変更が必要な為、このように改修してみました。

Gitは変更した全ての記録を持っているので、
パスワードが含まれているコミットはコミット履歴を統合して潰すようにしておいてくださいね。
知識のある人には簡単に抜かれますので、念入りに確認してください。

まぁ、BitBucketやGitHub(有料プラン)のプライベートリポジトリを借りてノーガード戦法というゴリ押しもありだと思います。

非公開フォルダにパスワードだけ変数指定したファイルを読み込ませる、等も過去行ったのですが、フレームワーク自体の使い方が甘く、至る所で require が必要になってしまい辞めた経験があります。

このケースでは、定数として宣言する案があります。
この場合必ずスタートするindex.phpに1行放り込んでおけば何時でも何処でもパスコードが利用出来ます。

このほかに良い方法があれば、教えてくださると助かります。

他と比べて特別優れているわけではありませんが、環境変数を使う案もあります。
getenv - PHP Manual

Dockerではオーバーヘッドの少ない仮想マシンを立ち上げて、
1アプリ1仮想マシン(コンテナ)で動作させますので、
この環境変数に値を突っ込んで起動するというのは綺麗にハマります。

投稿2017/12/21 08:44

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakamata

2017/12/21 09:03

回答ありがとうございます。 悪くない方法と伺えてとても安心できました。 過去Gitにあげてしまったパスワードは消すなり変更するなりするのが必須ですね。 改めて気を付けるようにいたします。 また定数として宣言し、index.php にrequireを書くという方法も、考えてみればその通りですね。 応用としての発想に至らない事が多くこれも大変参考になりました。 また、getenv()での記載は $_SERVER['hoge’] 同じ結果になる様ですね。 個人的には大文字でうやうやしく宣言している方が特殊な事をしている感じがあって好みです。 色々な方向性を示してくださりありがとうございました。 とても参考になりました。
guest

0

UnitTestはしない前提、composerパッケージなどのコマンドラインからDBアクセスをするようなPHPを実行しない前提ならよいと思います。ある程度大きなプロジェクトになってくると、複数の会社や外部エンジニアに手伝ってもらうことが多々ありますが、トリッキーなことをすると説明がめんどくさいと思います。

流行りのフレームワークではプロジェクト内のconfig/database.phpなどに置かれていることが多いのでconfigディレクトリ内にDBパスワードが見つけられないとなると、いろいろ手間かと思います。質問する側も答える側も。

require "../../secret.php";

という様に非公開フォルダにパスワードだけ変数指定したファイルを読み込ませる、等も過去行ったのですが、フレームワーク自体の使い方が甘く、至る所で require が必要になってしまい辞めた経験があります。
またrequireをするにも、公開ファイル内に記載し、 .gitignore を使って該当ファイルのみは別で管理するという方法もありそうですが、管理している存在自体を忘れそうでこれも採用しませんでした。

普通はパスワードファイルをrequireじゃなくて、ModelDBクラスなど基底クラスを作って、DBアクセスをする側はこのModel,DBクラスをuseなどでインポートするやり方が一般的かと思います。

Model,DBなどの基底クラスでconfig/db.phpのようなパスワード設定を読み込むだけですので、パスワード管理は特に気にする必要はなくなります。

否定的なことを書きましたが、どれが正解!という答えはないので、開発メンバーとやりやす方法で、セキュアである程度パフォーマンスがあればそれで良いと思います。いくらセキュアでもパフォーマンスが悪いとダメですし、これは頭のいい方法だ!と思っても複雑すぎると他の人と一緒に開発しにくくなってしまいます。

どちらにしても、どこかにパスワードを書いておかなければなりませんが、それをどこに書いておくかは開発ルール、運用ルールということになると思います。

重要なのはそれぞれのバランスだと思います。

投稿2017/12/21 08:10

Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakamata

2017/12/21 08:54

大変参考になるご回答、ありがとうございます。 フレームワークでは```config/database.php``` というパターン等もあるのですね。 基底クラスを作ってuse でインポートという方法もありというのも、初めての認識でした。 たしかに開発時のコンセンサスや運用時の状況に応じて、様々な方法とバランスがあるという見識を 得られ、自分の方向性があながち間違っていないことを認識できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問