Webサイトを公開する際、静的ファイルをサーバーにアップロードして展開(解凍)する作業は頻繁に行われます。しかし、この際に思わぬ落とし穴にハマることがあります。それが、ファイルやディレクトリの権限設定です。
tar.gzなどのアーカイブファイルをローカルで作成し、サーバーにアップロードしてtar -zxvf
コマンドなどで展開すると、ファイルやディレクトリの権限がWebサーバー(ApacheやNginxなど)がアクセスするのに適していない値になっていることが少なくありません。
このような不適切な権限のままでは、サイトが正しく表示されなかったり、最悪の場合、セキュリティリスクにさらされたりします。今回は、この問題を解決するためのLinuxコマンドについて、Amazon Linux 2023を例に詳しく解説します。
ページコンテンツ
なぜ不適切な権限になるのか?
アーカイブファイルを展開した際に、なぜファイル権限がWeb公開に適さない値になってしまうのでしょうか。その理由はいくつか考えられます。
ローカル環境とサーバー環境の差異
ローカルマシンでアーカイブを作成した際、その時点でのファイル権限がそのまま保存されます。多くの場合、ローカル環境では厳密な権限管理は行わないため、所有者しかアクセスできない設定(600
など)になっていることがあります。このファイルをサーバーにアップロードし、Webサーバーのユーザー(通常はapache
やnginx
など)がアクセスしようとしても、権限がないためエラーになります。
セキュリティ上の問題
tar
コマンドなどでアーカイブを作成する際、ユーザーの意図しないパーミッションが付与されることがあります。特に、777
のように誰でも書き込み可能な権限は、悪意のある第三者による不正なファイルのアップロードや改ざんのリスクを高めます。
umask値の影響
Linuxシステムには、新しくファイルやディレクトリを作成したときにデフォルトで付与される権限を決定する**umask
**(ユーザーマスク)という設定があります。ローカル環境とサーバー環境でこのumask
値が異なる場合、同じ操作をしても異なるパーミッションのファイルが作成されることがあります。
Web公開用の静的ファイルには、以下のような権限が推奨されます。
- ディレクトリ(フォルダ):
755
- 所有者は読み書き実行可能
- グループとその他は読み込みと実行のみ可能
- ファイル:
644
- 所有者は読み書き可能
- グループとその他は読み込みのみ可能
この権限設定であれば、Webサーバーはディレクトリをたどり、ファイルを読み込むことができます。同時に、不要な書き込み権限を制限することでセキュリティを向上させることができます。
解決策:find
コマンドで一括置換
では、不適切な権限になってしまったファイルを、一括で適切な値に変更するにはどうすれば良いでしょうか。ファイルが数個程度なら手動でchmod
コマンドを使っても良いですが、数が多いと非効率的です。
こで活躍するのが、find
コマンドです。find
コマンドは、指定したディレクトリ以下のファイルやディレクトリを検索する強力なツールです。これとchmod
コマンドを組み合わせることで、ディレクトリは755
に、ファイルは644
に一括で変更することができます。
ディレクトリの権限を一括変更するコマンド
find path/ -type d -exec chmod 755 {} +
このコマンドを分解して見てみましょう。
find path/
: 検索を開始するパスを指定します。path/
の部分は、Webサイトのルートディレクトリや、変更したいファイルがあるディレクトリのパスに置き換えてください。-type d
: 検索対象をディレクトリ(d
)に限定します。-exec chmod 755 {} +
: 検索で見つかったすべてのディレクトリに対して、chmod 755
コマンドを実行します。{}
:find
コマンドが見つけたファイル(ここではディレクトリ)のパスが入ります。+
:find
コマンドで見つかった複数のファイルをまとめて一度にchmod
コマンドの引数として渡します。これにより、コマンドの実行回数を減らし、処理を高速化できます。もし+
の代わりに;
を使うと、見つかったファイルごとにchmod
コマンドが実行されるため、処理が遅くなります。
ファイルの権限を一括変更するコマンド
find path/ -type f -exec chmod 644 {} +
こちらも同様に分解して解説します。
find path/
: 検索を開始するパスを指定します。-type f
: 検索対象をファイル(f
)に限定します。-exec chmod 644 {} +
: 検索で見つかったすべてのファイルに対して、chmod 644
コマンドを実行します。
これらのコマンドをWebサイトのルートディレクトリで実行することで、すべてのディレクトリが755
に、すべてのファイルが644
に一括で設定されます。
コマンド実行の前に確認すべきこと
これらのコマンドは非常に強力ですが、実行する前にいくつかの注意点があります。
path/
を正しく指定する
コマンドを実行する際は、必ずカレントディレクトリや絶対パスを正しく指定してください。例えば、WordPressのテーマディレクトリ内であれば、find wp-content/themes/your-theme-name/ ...
のようにパスを指定します。誤ったパスを指定すると、意図しないファイルまで権限が変更されてしまう可能性があります。
権限の意味を理解する
755
や644
といった数値は、ユーザー、グループ、その他のユーザーに対する**読み込み(4
)、書き込み(2
)、実行(1
)**の権限を表しています。これらの意味を理解しておくことで、状況に応じて適切な権限を設定できるようになります。
所有者とグループを確認する
chmod
コマンドは権限を変更しますが、ファイルの所有者やグループは変更しません。Webサーバーがファイルにアクセスできるようにするには、chown
コマンドで所有者やグループも設定する必要があります。
# 所有者をapacheユーザー、グループをapacheグループに変更
chown -R apache:apache path/
Amazon Linux 2023における補足
Amazon Linux 2023は、Amazon Web Services(AWS)が提供する最新のLinuxディストリビューションです。多くのAWSユーザーがWebサーバーとして利用しています。
Amazon Linux 2023では、ApacheやNginxが一般的なWebサーバーとして使用されます。これらのWebサーバープロセスは、apache
やnginx
といった特定のユーザーとグループで動作することが多いです。
したがって、Webサイトを公開する際は、今回紹介したchmod
コマンドに加えて、chown
コマンドでこれらのユーザー・グループに所有権を付与してあげることも重要です。これにより、Webサーバーがファイルの読み書き(※必要に応じて)を正しく行えるようになります。
まとめ
Webサイトの静的ファイルをサーバーにアップロードする際は、ファイル権限の問題に注意が必要です。tar.gz
などのアーカイブを展開した際に、意図しない権限になっていないか必ず確認しましょう。
もし不適切な権限になっていても、今回ご紹介したfind
コマンドとchmod
コマンドを組み合わせることで、ディレクトリは755
に、ファイルは644
に一括で設定し直すことができます。
対象
ディレクトリ
ファイル
コマンド
find path/ -type d -exec chmod 755 {} +
find path/ -type f -exec chmod 644 {} +
これらのコマンドを使いこなすことで、Webサイトのデプロイ作業をスムーズに行うことができ、不要なトラブルを未然に防ぐことができます。皆さんのWeb開発ライフに役立てば幸いです。