0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

1からのWEBサーバ作り ローカルにApacheのインストールと実践

Last updated at Posted at 2025-12-06

1からのWEBサーバ作り ローカルにApacheのインストールと実践

はじめに

この記事では前回学んだHTTP通信の仕組みをもとにApacheサーバを立て、実用的なWebサーバ環境を構築します。

Webサーバのソフトウェアには複数ありますが、今回は世界中で使われており、歴史のあるApache HTTP Serverを使用します。基本的なインストールから、Virtual Host、Basic認証、HTTPS化まで、段階的に学んでいきます。

前回の記事はこちらです。

この記事はシリーズの第4回です。シリーズ全体の目次は以下からご覧ください。

シリーズ目次: 1からのWEBサーバ作り - 完全ガイドシリーズ


1. 目的と完成条件の定義

1.1 目的

Apache HTTP Serverを用いたWebサーバ環境を構築し、複数サイトのホスティング、認証機能、セキュアな通信を実現できるようになることを目指します。具体的には以下の技術要素を習得します。

  • Apacheのインストールと基本設定
  • Virtual Hostによる複数サイトの同時運用
  • Basic認証によるアクセス制御
  • 自己署名証明書を用いたHTTPS通信の実装

1.2 完成条件

以下の条件をすべて満たすこと:

No 検証項目 合格条件
1 インストールと起動 Apacheをインストールし、Apache2 Default Pageを開く
2 Virtual Hostの設定 2つのサイトを同時に立て、それぞれ閲覧する
3 Basic認証 特定のサイトにパスワードを設定し、認証成功、失敗時の反応を確認する
4 HTTPS化 自己署名証明書を作成、使用し、サイトの通信を暗号化し、HTTPS通信でサイトを閲覧する

2. 前提条件

2.1 環境情報

  • 対象OS: Ubuntu 24.04.3 LTS
  • CPU: AMD RYZEN 7 7840HS
  • 実行環境: ローカルマシン(物理サーバ)
  • ネットワーク: ローカルネットワーク(192.168.x.x)
  • 利用ツール: apt(パッケージ管理)、openssl(証明書生成)

2.2 必要なマシン構成

  • サーバマシン: Ubuntu 24.04.3 LTS がインストール済み
  • メモリ: 最低2GB以上推奨
  • ディスク: 10GB以上の空き容量

2.3 前提知識

  • 基本的なLinuxコマンド操作
  • HTTP/HTTPSプロトコルの基礎知識
  • テキストエディタ(vi、nano等)の基本操作

3. WEBサーバとは

3.1 WEBサーバの定義

Wikipediaによると、Webサーバは「HTTPに則り、クライアントソフトウェア(ブラウザ)に対してHTMLや画像などを提供するサービスプログラムおよびそのコンピュータ」を指します。

MDN Web Docsでは「Webサーバはハードウェアまたはソフトウェア、あるいはその両方を指し、Webサイトのファイルを格納し、HTTPサーバとしてユーザーのアクセスを制御する仕組み」と説明されています。

3.2 基本的な仕組み

基本的な仕組みについては前回の記事を閲覧ください。

3.3 役割と重要性

  • 公開の基盤: WebサイトやWebサービスをインターネット上に公開するために不可欠
  • セキュリティと可用性: ロードバランサやWAFと連携し、大規模サービスでも安定した配信を実現
  • 柔軟な構成: Virtual Hostにより1台のサーバで複数のWebサイトをホスティング可能

4. 全体構成図とポート設計

今回構築するシステムの全体像は以下の通りです。

4.1 使用ポート

ポート番号 プロトコル 用途
80 HTTP 通常のWeb通信(site1.local)
443 HTTPS 暗号化されたWeb通信(site2.local)

4.2 ディレクトリ構成

/var/www/
├── html/                # デフォルトサイト
├── site1/              # Virtual Host 1(HTTP)
│   └── index.html
└── site2/              # Virtual Host 2(HTTPS + Basic認証)
    └── index.html

/etc/apache2/
├── sites-available/    # サイト設定ファイル
│   ├── site1.conf
│   └── site2.conf
├── sites-enabled/      # 有効化されたサイト(シンボリックリンク)
├── ssl/               # SSL証明書
│   ├── server.crt
│   └── server.key
└── .htpasswd          # Basic認証用パスワードファイル

5. Apacheのインストール

ここからはPCにApacheをインストールしていきます。

5.1 パッケージの更新とインストール

まず、パッケージリストを最新化し、Apacheをインストールします。

# パッケージリストの更新
sudo apt update

# Apacheのインストール
sudo apt install apache2 -y

-yオプションを付けることで、インストール確認を自動的に「はい」で進めます。

5.2 Apacheの起動確認

Apacheが正常に起動できているか確認します。

sudo systemctl status apache2

起動できていると以下のように表示されます。

tamago@tamago-LOQ-16APH8:~$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: >
     Active: active (running) since Sat 2025-12-06 21:05:28 JST; 2min 48s ago
       Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 11733 (apache2)
      Tasks: 55 (limit: 18005)
     Memory: 6.0M (peak: 7.8M)
        CPU: 62ms
     CGroup: /system.slice/apache2.service
             ├─11733 /usr/sbin/apache2 -k start
             ├─11735 /usr/sbin/apache2 -k start
             └─11736 /usr/sbin/apache2 -k start

Active: active (running) と表示されていれば正常に起動しています。

もし起動できていない場合は以下のコマンドで起動してください。

sudo systemctl start apache2

5.3 自動起動の設定

サーバ再起動時にApacheが自動的に起動するように設定します。

sudo systemctl enable apache2

以下のように表示されれば設定完了です。

Synchronizing state of apache2.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable apache2

5.4 ファイアウォールの設定(必要に応じて)

ファイアウォールが有効な場合、HTTPとHTTPSのポートを開放します。

# UFWの状態確認
sudo ufw status

# HTTPとHTTPSを許可
sudo ufw allow 'Apache Full'

# または個別に設定
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

6. Apacheにアクセス

6.1 ローカルマシンからのアクセス

ブラウザから実際にアクセスしてみましょう。

ApacheをインストールしたPCからアクセスする場合はブラウザに以下のいずれかを入力します。

  • http://localhost
  • http://127.0.0.1

6.2 別のデバイスからのアクセス

別のデバイスからアクセスする場合は、サーバのIPアドレスを確認します。

# IPアドレスの確認
ip addr show

または

hostname -I

ブラウザに http://[サーバのIPアドレス] を入力してアクセスします。

6.3 デフォルトページの確認

正常にアクセスできると以下のような画面が表示されます。

Apache2 Default Page

この画面が表示されれば、Apacheのインストールと起動は完了です。

このページは /var/www/html/index.html にあるデフォルトのページです。


7. Virtual Hostの設定

Virtual Hostを使うことで、1台のサーバで複数のWebサイトを運用できます。ここでは2つのサイトを構築します。

  • site1.local: HTTP通信で動作する通常のサイト
  • site2.local: HTTPS通信とBasic認証を設定したセキュアなサイト

7.1 ドキュメントルートの作成

まず、各サイトのコンテンツを格納するディレクトリを作成します。

# site1用のディレクトリ作成
sudo mkdir -p /var/www/site1

# site2用のディレクトリ作成
sudo mkdir -p /var/www/site2

-pオプションは親ディレクトリも含めて作成するオプションです。

7.2 テストページの作成

各サイトに識別可能なHTMLファイルを作成します。

site1のindex.html

sudo nano /var/www/site1/index.html

以下の内容を記述します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Site 1 - HTTP</title>
    <style>
        body {
            font-family: sans-serif;
            max-width: 600px;
            margin: 50px auto;
            padding: 20px;
            background-color: #ffffff;
            color: #333333;
        }
        .container {
            border: 1px solid #cccccc;
            padding: 20px;
            border-radius: 4px;
        }
        h1 {
            font-size: 24px;
            border-bottom: 1px solid #eeeeee;
            padding-bottom: 10px;
            margin-top: 0;
        }
        .status {
            color: green;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Site 1</h1>
        <p><strong>Status:</strong> <span class="status">Running (HTTP)</span></p>
        <p><strong>Virtual Host:</strong> site1.local</p>
        <hr>
        <p>アクセス時刻: <span id="time"></span></p>
    </div>
    <script>
        document.getElementById('time').textContent = new Date().toLocaleString('ja-JP');
    </script>
</body>
</html>

site2のindex.html

sudo nano /var/www/site2/index.html

以下の内容を記述します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Site 2 - HTTPS + Auth</title>
    <style>
        body {
            font-family: sans-serif;
            max-width: 600px;
            margin: 50px auto;
            padding: 20px;
            background-color: #ffffff;
            color: #333333;
        }
        .container {
            border: 1px solid #cccccc;
            padding: 20px;
            border-radius: 4px;
        }
        h1 {
            font-size: 24px;
            border-bottom: 1px solid #eeeeee;
            padding-bottom: 10px;
            margin-top: 0;
        }
        .status-ok {
            color: green;
            font-weight: bold;
        }
        .info-row {
            margin-bottom: 10px;
        }
        .badge {
            display: inline-block;
            background: #f0f0f0;
            color: #333;
            padding: 2px 8px;
            border-radius: 4px;
            font-size: 0.85em;
            margin-right: 5px;
            border: 1px solid #ddd;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Site 2 (Secure)</h1>
        
        <div class="info-row">
            <strong>Status:</strong> <span class="status-ok">Running</span>
        </div>
        
        <div class="info-row">
            <strong>Protocol:</strong> HTTPS
            <span class="badge">Encrypted</span>
        </div>

        <div class="info-row">
            <strong>Virtual Host:</strong> site2.local
        </div>

        <div class="info-row">
            <strong>Auth:</strong> Basic認証
            <span class="badge">Authenticated</span>
        </div>

        <hr>
        <p>アクセス時刻: <span id="time"></span></p>
    </div>
    <script>
        document.getElementById('time').textContent = new Date().toLocaleString('ja-JP');
    </script>
</body>
</html>

7.3 ディレクトリの所有権設定

Apacheがファイルにアクセスできるよう、所有権を設定します。

# 所有者をwww-dataに変更
sudo chown -R www-data:www-data /var/www/site1
sudo chown -R www-data:www-data /var/www/site2

# パーミッションの設定
sudo chmod -R 755 /var/www/site1
sudo chmod -R 755 /var/www/site2
  • www-dataはApacheの実行ユーザーです
  • 755は所有者が読み書き実行可能、その他は読み取りと実行のみ可能という設定です

7.4 Virtual Hostの設定ファイル作成

site1の設定ファイル

sudo nano /etc/apache2/sites-available/site1.conf

以下の内容を記述します。

<VirtualHost *:80>
    # サーバの基本設定
    ServerName site1.local
    ServerAdmin webmaster@site1.local
    
    # ドキュメントルート
    DocumentRoot /var/www/site1
    
    # ディレクトリ設定
    <Directory /var/www/site1>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    # ログファイルの設定
    ErrorLog ${APACHE_LOG_DIR}/site1_error.log
    CustomLog ${APACHE_LOG_DIR}/site1_access.log combined
</VirtualHost>

設定項目の説明

  • ServerName: このVirtual Hostに割り当てるドメイン名
  • ServerAdmin: 管理者のメールアドレス(エラーページに表示されることがある)
  • DocumentRoot: Webコンテンツが格納されているディレクトリ
  • Options Indexes: ディレクトリ内のファイル一覧表示を許可
  • FollowSymLinks: シンボリックリンクを辿ることを許可
  • AllowOverride All: .htaccessファイルによる設定上書きを許可
  • Require all granted: すべてのアクセスを許可

site2の設定ファイル

sudo nano /etc/apache2/sites-available/site2.conf

以下の内容を記述します。

<VirtualHost *:443>
    # サーバの基本設定
    ServerName site2.local
    ServerAdmin webmaster@site2.local
    
    # ドキュメントルート
    DocumentRoot /var/www/site2
    
    # SSL/TLS設定
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/server.crt
    SSLCertificateKeyFile /etc/apache2/ssl/server.key
    
    # ディレクトリ設定とBasic認証
    <Directory /var/www/site2>
        Options Indexes FollowSymLinks
        AllowOverride All
        
        # Basic認証の設定
        AuthType Basic
        AuthName "Restricted Area - Please Enter Your Credentials"
        AuthUserFile /etc/apache2/.htpasswd
        Require valid-user
    </Directory>
    
    # ログファイルの設定
    ErrorLog ${APACHE_LOG_DIR}/site2_error.log
    CustomLog ${APACHE_LOG_DIR}/site2_access.log combined
</VirtualHost>

HTTPS関連の設定項目

  • SSLEngine on: SSL/TLSを有効化
  • SSLCertificateFile: サーバ証明書のパス
  • SSLCertificateKeyFile: 秘密鍵のパス
  • AuthType Basic: Basic認証を使用
  • AuthUserFile: 認証情報を格納したファイルのパス

7.5 hostsファイルの編集

ローカル環境でドメイン名を使用するため、hostsファイルを編集します。

sudo nano /etc/hosts

以下の2行を追加します。

127.0.0.1    site1.local
127.0.0.1    site2.local

Windowsからアクセスする場合

Windowsマシンから上記のサイトにアクセスする場合は、WindowsのC:\Windows\System32\drivers\etc\hostsファイルに以下を追加してください(管理者権限が必要)。

[サーバのIPアドレス]    site1.local
[サーバのIPアドレス]    site2.local

例:

192.168.1.100    site1.local
192.168.1.100    site2.local

7.6 サイトの有効化

作成した設定ファイルを有効化します。

# site1を有効化
sudo a2ensite site1.conf

# site2を有効化(後でHTTPS設定後に有効化)
# sudo a2ensite site2.conf

7.7 Apacheの設定テストと再起動

設定にエラーがないか確認してから、Apacheを再起動します。

# 設定ファイルの構文チェック
sudo apache2ctl configtest

Syntax OKと表示されればOKです。

# Apacheの再起動
sudo systemctl restart apache2

7.8 site1への動作確認

ブラウザで http://site1.local にアクセスして、作成したページが表示されることを確認します。

image.png

トラブルシューティング: ページが表示されない場合

  1. Apacheが起動しているか確認: sudo systemctl status apache2
  2. hostsファイルが正しく編集されているか確認: cat /etc/hosts
  3. 設定ファイルにエラーがないか確認: sudo apache2ctl configtest
  4. エラーログを確認: sudo tail -f /var/log/apache2/site1_error.log

8. Basic認証の設定

Basic認証は、ユーザー名とパスワードによる簡易的なアクセス制限機能です。site2.localに対して認証を設定します。

8.1 パスワードファイルの作成

htpasswdコマンドを使用して、認証用のパスワードファイルを作成します。

# 最初のユーザーを作成(ファイルも同時に作成される)
sudo htpasswd -c /etc/apache2/.htpasswd user1

パスワードの入力を求められるので、任意のパスワードを2回入力します。

New password: 
Re-type new password: 
Adding password for user user1

-cオプションは新規ファイル作成時のみ使用します。2人目以降のユーザーを追加する場合は-cオプションを外してください(既存ファイルが上書きされてしまいます)。

8.2 追加ユーザーの登録

2人目以降のユーザーを追加する場合は以下のようにします。

# 2人目のユーザーを追加(-cオプションなし)
sudo htpasswd /etc/apache2/.htpasswd user2

8.3 パスワードファイルの確認

作成されたファイルの内容を確認します。

sudo cat /etc/apache2/.htpasswd

以下のように暗号化されたパスワードが表示されます。

user1:$apr1$xyz123$abcdefghijklmnopqrstuvwxyz
user2:$apr1$abc789$zyxwvutsrqponmlkjihgfedcba

パスワードはBCrypt方式で暗号化されているため、元のパスワードを逆算することはできません。

8.4 パスワードファイルのパーミッション設定

セキュリティのため、パスワードファイルの権限を制限します。

sudo chmod 640 /etc/apache2/.htpasswd
sudo chown root:www-data /etc/apache2/.htpasswd

これにより、rootとwww-data(Apacheの実行ユーザー)のみが読み取り可能になります。


9. HTTPS化(SSL/TLS設定)

HTTPS通信を実現するため、自己署名証明書を作成し、site2.localに適用します。

自己署名証明書について

自己署名証明書は学習や開発環境では有用ですが、本番環境では使用しないでください。本番環境では Let's Encrypt などの信頼された認証局が発行する証明書を使用します。

自己署名証明書を使用すると、ブラウザに「この接続は安全ではありません」という警告が表示されますが、これは正常な動作です。

9.1 必要なモジュールの有効化

ApacheでSSL/TLSを使用するため、必要なモジュールを有効化します。

# SSLモジュールの有効化
sudo a2enmod ssl

# ヘッダー制御モジュールの有効化(セキュリティヘッダーに使用)
sudo a2enmod headers

# rewriteモジュールの有効化(HTTPからHTTPSへのリダイレクトに使用)
sudo a2enmod rewrite

各コマンドで以下のようなメッセージが表示されます。

Enabling module ssl.
To activate the new configuration, you need to run:
  systemctl restart apache2

9.2 SSL証明書保存用ディレクトリの作成

証明書を格納するディレクトリを作成します。

sudo mkdir -p /etc/apache2/ssl

9.3 自己署名証明書の作成

opensslを使用して、秘密鍵とサーバ証明書を作成します。ここでは2つのやり方を紹介します。

共通:opensslのインストール

まず、opensslをインストールします。以下のコマンドを実行してください。

sudo apt update
sudo apt install openssl

方法1: 秘密鍵と証明書を一度に生成(簡易版)

秘密鍵とサーバ証明書を1つのコマンドで生成します。

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/apache2/ssl/server.key \
  -out /etc/apache2/ssl/server.crt

オプションの説明

  • req: 証明書要求と証明書の生成を行う
  • -x509: 証明書要求ではなく、自己署名証明書を直接生成
  • -nodes: 秘密鍵を暗号化しない(no DES: パスフレーズなし)
  • -days 365: 証明書の有効期限を365日に設定
  • -newkey rsa:2048: 2048ビットのRSA秘密鍵を新規作成
  • -keyout: 秘密鍵の出力先パス
  • -out: 証明書の出力先パス

コマンドを実行すると、証明書の情報入力を求められます。

Generating a RSA private key
.......+++++
................+++++
writing new private key to '/etc/apache2/ssl/server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Osaka
Locality Name (eg, city) []:Osaka
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:IT Department
Common Name (e.g. server FQDN or YOUR name) []:site2.local
Email Address []:admin@site2.local

入力項目の説明

  • Country Name: 国コード(日本の場合はJP)
  • State or Province Name: 都道府県名
  • Locality Name: 市区町村名
  • Organization Name: 組織名
  • Organizational Unit Name: 部署名
  • Common Name: 重要: Virtual Hostで設定したドメイン名(site2.local)を必ず入力
  • Email Address: 管理者のメールアドレス

これらを埋めるのは必須ではなく、Common Name以外は設定しなくとも正常に動作します。

方法2: 段階的に生成

より詳細な制御が必要な場合は、以下の手順で段階的に生成します。

ステップ1: 秘密鍵の生成

まず、2048ビットのRSA秘密鍵を生成します。

sudo openssl genrsa -out /etc/apache2/ssl/server.key 2048

実行結果:

Generating RSA private key, 2048 bit long modulus (2 primes)
.......................+++++
..+++++
e is 65537 (0x010001)

セキュリティを強化したい場合は、4096ビットの鍵を生成することもできます:

sudo openssl genrsa -out /etc/apache2/ssl/server.key 4096

ただし、鍵長が長くなるほど処理時間が増加します。

ステップ2: CSR(証明書署名要求)の生成

次に、秘密鍵を使用してCSRを生成します。

sudo openssl req -new -key /etc/apache2/ssl/server.key \
  -out /etc/apache2/ssl/server.csr

証明書情報の入力を求められます(方法1と同様):

-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Osaka
Locality Name (eg, city) []:Osaka
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:IT Department
Common Name (e.g. server FQDN or YOUR name) []:site2.local
Email Address []:admin@site2.local

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

A challenge passwordAn optional company nameは空欄のままEnterを押してください。

ステップ3: 自己署名証明書の生成

CSRを使用して、自己署名証明書を生成します。

sudo openssl x509 -req -days 365 \
  -in /etc/apache2/ssl/server.csr \
  -signkey /etc/apache2/ssl/server.key \
  -out /etc/apache2/ssl/server.crt

実行結果:

Signature ok
subject=C = JP, ST = Osaka, L = Osaka, O = My Company, OU = IT Department, CN = site2.local
Getting Private key

オプションの説明

  • x509: X.509証明書データを管理
  • -req: CSRを入力として使用
  • -days 365: 証明書の有効期限
  • -in: 入力するCSRファイル
  • -signkey: 署名に使用する秘密鍵
  • -out: 出力する証明書ファイル

ステップ4: CSRファイルの削除(オプション)

証明書が生成されたら、CSRファイルは不要になるため削除できます。

sudo rm /etc/apache2/ssl/server.csr

方法3: 設定ファイルを使った生成

証明書情報を事前に設定ファイルに記述することで、対話的な入力を省略できます。

ステップ1: OpenSSL設定ファイルの作成

sudo nano /etc/apache2/ssl/openssl.cnf

以下の内容を記述:

[ req ]
default_bits       = 2048
default_md         = sha256
default_keyfile    = server.key
prompt             = no
encrypt_key        = no
distinguished_name = req_distinguished_name
x509_extensions    = v3_req

[ req_distinguished_name ]
C  = JP
ST = Osaka
L  = Osaka
O  = My Company
OU = IT Department
CN = site2.local
emailAddress = admin@site2.local

[ v3_req ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = site2.local
DNS.2 = www.site2.local
DNS.3 = localhost
IP.1 = 127.0.0.1
IP.2 = 192.168.1.100

設定項目の説明

  • [ alt_names ]セクション: SANs(Subject Alternative Names)を設定
  • DNS.1, DNS.2: 証明書が有効なドメイン名
  • IP.1, IP.2: 証明書が有効なIPアドレス
  • IP.2は実際のサーバIPアドレスに変更してください

ステップ2: 設定ファイルを使用して証明書を生成

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -config /etc/apache2/ssl/openssl.cnf \
  -keyout /etc/apache2/ssl/server.key \
  -out /etc/apache2/ssl/server.crt

この方法では対話的な入力なしで証明書が生成されます。

Generating a RSA private key
.......+++++
................+++++
writing new private key to '/etc/apache2/ssl/server.key'
-----

9.4 証明書ファイルの確認

生成された証明書ファイルを確認します。

# ファイルの存在確認
ls -l /etc/apache2/ssl/

# 証明書の内容確認
sudo openssl x509 -in /etc/apache2/ssl/server.crt -text -noout

以下のような情報が表示されます。

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            xx:xx:xx:xx:xx:xx:xx:xx
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = JP, ST = Osaka, L = Osaka, O = My Company, OU = IT Department, CN = site2.local
        Validity
            Not Before: Dec  6 12:00:00 2025 GMT
            Not After : Dec  6 12:00:00 2026 GMT
        Subject: C = JP, ST = Osaka, L = Osaka, O = My Company, OU = IT Department, CN = site2.local
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)

9.5 証明書ファイルのパーミッション設定

セキュリティのため、秘密鍵のパーミッションを制限します。

sudo chmod 600 /etc/apache2/ssl/server.key
sudo chmod 644 /etc/apache2/ssl/server.crt
  • 秘密鍵(.key)は所有者のみが読み取り可能(600)
  • 証明書(.crt)は誰でも読み取り可能だが書き込み不可(644)

9.6 site2の有効化

これまでの設定を反映させるため、site2を有効化してApacheを再起動します。

# site2の有効化
sudo a2ensite site2.conf

# 設定の構文チェック
sudo apache2ctl configtest

# Apacheの再起動
sudo systemctl restart apache2

9.7 HTTPSでの動作確認

ブラウザで https://site2.local にアクセスします。

  1. 証明書の警告画面が表示されます

    • Chromeの場合: 「この接続ではプライバシーが保護されません」
    • Firefoxの場合: 「警告: 潜在的なセキュリティリスクあり」
  2. 「詳細設定」→「site2.local に進む(安全ではありません)」をクリック

  3. Basic認証のダイアログが表示されます

    • ユーザー名: user1
    • パスワード: 先ほど設定したパスワード
  4. 認証に成功すると、site2のページが表示されます

image.png

ここで正しいユーザ名とパスワードを打つと
image.png
このようにアクセスすることができました。

試しパスワードを間違えて見ると、再度ユーザ名とパスワードを求め、キャンセルを押すと「あなたを認証できませんでした」とアクセスできないようにすることができました。
image.png

これで

  • Virtual Hostによる複数サイトの同時運用
  • Basic認証によるアクセス制御
  • 自己署名証明書を用いたHTTPS通信の実装
    は完成です

警告画面が表示される理由

自己署名証明書は信頼された認証局(CA)によって署名されていないため、ブラウザは「この証明書を信頼できない」と判断します。これは自己署名証明書を使用する場合の正常な動作です。

本番環境では Let's Encrypt などの無料の認証局を使用することで、この警告を回避できます。


10. 動作確認と検証

構築したシステムが正常に動作しているか、各検証項目を確認します。

10.1 検証項目1: Apacheのインストールと起動

確認方法:

# Apacheの稼働状況確認
sudo systemctl status apache2

# プロセス確認
ps aux | grep apache2

# ポート使用状況確認
sudo ss -tlnp | grep apache2

期待される結果:

  • Active: active (running) と表示される
  • apache2プロセスが複数起動している
  • ポート80と443でLISTEN状態になっている
LISTEN 0      511                *:443             *:*    users:(("apache2",pid=16430,fd=6),("apache2",pid=16429,fd=6),("apache2",pid=16427,fd=6))
LISTEN 0      511                *:80              *:*    users:(("apache2",pid=16430,fd=4),("apache2",pid=16429,fd=4),("apache2",pid=16427,fd=4))

10.2 検証項目2: Virtual Hostの設定

確認方法:

  1. ブラウザで http://site1.local にアクセス
  2. ブラウザで https://site2.local にアクセス(警告を無視して進む)

期待される結果:

  • site1.local: 紫色のグラデーション背景のページが表示される
  • site2.local: ピンク色のグラデーション背景のページが表示される(認証後)
  • それぞれ異なるコンテンツが表示される

ログの確認:

# site1のアクセスログ
sudo tail -f /var/log/apache2/site1_access.log

# site2のアクセスログ
sudo tail -f /var/log/apache2/site2_access.log

10.3 検証項目3: Basic認証

テストケース1: 認証情報なしでアクセス

curl -I https://site2.local -k

期待される結果:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Restricted Area - Please Enter Your Credentials"

テストケース2: 正しい認証情報でアクセス

curl -u user1:password https://site2.local -k

期待される結果: HTMLコンテンツが返される(200 OK)

テストケース3: 誤った認証情報でアクセス

curl -u user1:wrongpassword https://site2.local -k

期待される結果:

HTTP/1.1 401 Unauthorized

ブラウザでのテスト:

  1. https://site2.local にアクセス
  2. 認証ダイアログで「キャンセル」をクリック → 401 Unauthorized ページが表示される
  3. 誤ったパスワードを入力 → 再度認証ダイアログが表示される
  4. 正しいユーザー名とパスワードを入力 → ページが正常に表示される

10.4 検証項目4: HTTPS化

SSL/TLS接続の確認:

# SSL証明書の情報確認
openssl s_client -connect site2.local:443 -servername site2.local

期待される結果:

CONNECTED(00000003)
depth=0 C = JP, ST = Osaka, L = Osaka, O = My Company, OU = IT Department, CN = site2.local
verify error:num=18:self signed certificate
verify return:1
---
Certificate chain
 0 s:C = JP, ST = Osaka, L = Osaka, O = My Company, OU = IT Department, CN = site2.local
   i:C = JP, ST = Osaka, L = Osaka, O = My Company, OU = IT Department, CN = site2.local
---

ブラウザでのSSL確認:

  1. https://site2.local にアクセス
  2. アドレスバーの鍵アイコンをクリック
  3. 「証明書」または「接続は保護されていません」をクリック
  4. 証明書情報を確認:
    • 発行先: site2.local
    • 発行者: site2.local(自己署名)
    • 有効期限: 365日

通信の暗号化確認:

ブラウザの開発者ツール(F12)→「セキュリティ」タブで以下を確認:

  • 接続が暗号化されている
  • TLS 1.2またはTLS 1.3が使用されている
  • 暗号化スイートの情報

11. セキュリティ強化(追加設定)

11.1 セキュリティヘッダーの追加

site2の設定ファイルにセキュリティヘッダーを追加します。

sudo nano /etc/apache2/sites-available/site2.conf

</VirtualHost>の直前に以下を追加:

    # セキュリティヘッダーの追加
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"

セキュリティヘッダーの説明

  • Strict-Transport-Security: HTTPS接続を強制(HSTS)
  • X-Frame-Options: クリックジャッキング攻撃を防止
  • X-Content-Type-Options: MIMEタイプスニッフィングを防止
  • X-XSS-Protection: XSS攻撃の検出と防御
  • Referrer-Policy: リファラー情報の送信ポリシー

11.2 不要な情報の非表示

Apacheのバージョン情報を隠すため、セキュリティ設定を変更します。

sudo nano /etc/apache2/conf-available/security.conf

以下の行を変更:

# 変更前
ServerTokens OS
ServerSignature On

# 変更後
ServerTokens Prod
ServerSignature Off

11.3 TLSプロトコルと暗号化スイートの強化

sudo nano /etc/apache2/sites-available/site2.conf

SSL設定部分に以下を追加:

    # TLSプロトコルの制限(TLS 1.2以上のみ許可)
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    
    # 強力な暗号化スイートのみ使用
    SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
    SSLHonorCipherOrder on

11.4 設定の反映

# 設定の構文チェック
sudo apache2ctl configtest

# Apacheの再起動
sudo systemctl restart apache2

Apacheの再起動だけだとBasic認証時パスワードを正しく入力しても再度打ち直しになることがあります。
ブラウザを再起動や、キャッシュのクリアなどをしてください。


12. トラブルシューティング

構築中に発生しやすい問題と解決方法をまとめます。

12.1 Apacheが起動しない

症状:

sudo systemctl start apache2
Job for apache2.service failed because the control process exited with error code.

原因と対処法:

  1. 設定ファイルの構文エラー

    sudo apache2ctl configtest
    

    エラー箇所が表示されるので修正する

  2. ポート競合

    sudo netstat -tlnp | grep :80
    sudo netstat -tlnp | grep :443
    

    他のプロセスがポートを使用している場合は停止する

  3. SSL証明書のパスが間違っている

    ls -l /etc/apache2/ssl/
    

    証明書ファイルが存在し、パーミッションが正しいか確認

12.2 Virtual Hostが動作しない

症状: デフォルトページが表示され続ける

対処法:

  1. サイトが有効化されているか確認

    ls -l /etc/apache2/sites-enabled/
    

    site1.confとsite2.confのシンボリックリンクがあるか確認

  2. hostsファイルの設定確認

    cat /etc/hosts | grep site
    
  3. DNSキャッシュのクリア

    sudo systemctl restart systemd-resolved
    
  4. ブラウザのキャッシュをクリア
    Ctrl + Shift + Delete でキャッシュを削除

12.3 Basic認証が動作しない

症状: 認証ダイアログが表示されない、または常に401エラー

対処法:

  1. パスワードファイルの存在とパーミッション確認

    sudo ls -l /etc/apache2/.htpasswd
    sudo cat /etc/apache2/.htpasswd
    
  2. パスワードファイルのパスが正しいか確認

    sudo grep AuthUserFile /etc/apache2/sites-available/site2.conf
    
  3. ユーザーの再作成

    sudo htpasswd -c /etc/apache2/.htpasswd user1
    
  4. エラーログの確認

    sudo tail -f /var/log/apache2/site2_error.log
    

12.4 HTTPS接続エラー

症状: ERR_SSL_PROTOCOL_ERROR または SEC_ERROR_UNKNOWN_ISSUER

対処法:

  1. SSLモジュールが有効か確認

    sudo apache2ctl -M | grep ssl
    

    表示されない場合: sudo a2enmod ssl

  2. 証明書ファイルの確認

    sudo openssl x509 -in /etc/apache2/ssl/server.crt -text -noout
    

    Common Nameがsite2.localと一致しているか確認

  3. ポート443が開いているか確認

    sudo netstat -tlnp | grep :443
    
  4. 証明書の再生成

    sudo rm /etc/apache2/ssl/server.*
    # 9.3節の手順で再生成
    

12.5 Permission Denied エラー

症状: 403 Forbidden エラー、またはログに Permission denied

対処法:

  1. ディレクトリのパーミッション確認

    ls -la /var/www/site1
    ls -la /var/www/site2
    
  2. 所有権の修正

    sudo chown -R www-data:www-data /var/www/site1
    sudo chown -R www-data:www-data /var/www/site2
    
  3. SELinuxの確認(該当する場合)

    sestatus
    # 有効な場合は適切なコンテキストを設定
    

12.6 ログファイルの確認方法

問題の原因を特定するため、ログを確認します。

# エラーログをリアルタイムで監視
sudo tail -f /var/log/apache2/error.log
sudo tail -f /var/log/apache2/site1_error.log
sudo tail -f /var/log/apache2/site2_error.log

# アクセスログの確認
sudo tail -f /var/log/apache2/access.log
sudo tail -f /var/log/apache2/site1_access.log
sudo tail -f /var/log/apache2/site2_access.log

# 特定のエラーを検索
sudo grep "error" /var/log/apache2/error.log | tail -20

13. 発展: HTTPからHTTPSへの自動リダイレクト

site2へのHTTPアクセスを自動的にHTTPSにリダイレクトする設定を追加します。

13.1 リダイレクト用の設定追加

sudo nano /etc/apache2/sites-available/site2.conf

ファイルの先頭に以下を追加:

# HTTP (port 80) での site2.local へのアクセスをHTTPSにリダイレクト
<VirtualHost *:80>
    ServerName site2.local
    
    # HTTPSへのリダイレクト
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
    
    ErrorLog ${APACHE_LOG_DIR}/site2_redirect_error.log
    CustomLog ${APACHE_LOG_DIR}/site2_redirect_access.log combined
</VirtualHost>

# 既存のHTTPS設定(変更なし)
<VirtualHost *:443>
    ...
</VirtualHost>

13.2 設定の反映

# rewriteモジュールが有効か確認
sudo a2enmod rewrite

# 設定の構文チェック
sudo apache2ctl configtest

# Apacheの再起動
sudo systemctl restart apache2

13.3 リダイレクトの動作確認

# HTTPアクセスがHTTPSにリダイレクトされることを確認
curl -I http://site2.local -L

期待される結果:

HTTP/1.1 301 Moved Permanently
Location: https://site2.local/

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Restricted Area - Please Enter Your Credentials"

14. 設定ファイルの完全版

14.1 site1.conf

<VirtualHost *:80>
    # サーバの基本設定
    ServerName site1.local
    ServerAdmin webmaster@site1.local
    
    # ドキュメントルート
    DocumentRoot /var/www/site1
    
    # ディレクトリ設定
    <Directory /var/www/site1>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    # ログファイルの設定
    ErrorLog ${APACHE_LOG_DIR}/site1_error.log
    CustomLog ${APACHE_LOG_DIR}/site1_access.log combined
</VirtualHost>

14.2 site2.conf

# HTTPからHTTPSへのリダイレクト
<VirtualHost *:80>
    ServerName site2.local
    
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
    
    ErrorLog ${APACHE_LOG_DIR}/site2_redirect_error.log
    CustomLog ${APACHE_LOG_DIR}/site2_redirect_access.log combined
</VirtualHost>

# HTTPS設定
<VirtualHost *:443>
    # サーバの基本設定
    ServerName site2.local
    ServerAdmin webmaster@site2.local
    
    # ドキュメントルート
    DocumentRoot /var/www/site2
    
    # SSL/TLS設定
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/server.crt
    SSLCertificateKeyFile /etc/apache2/ssl/server.key
    
    # TLSプロトコルの制限
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
    SSLHonorCipherOrder on
    
    # セキュリティヘッダー
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    
    # ディレクトリ設定とBasic認証
    <Directory /var/www/site2>
        Options Indexes FollowSymLinks
        AllowOverride All
        
        # Basic認証の設定
        AuthType Basic
        AuthName "Restricted Area - Please Enter Your Credentials"
        AuthUserFile /etc/apache2/.htpasswd
        Require valid-user
    </Directory>
    
    # ログファイルの設定
    ErrorLog ${APACHE_LOG_DIR}/site2_error.log
    CustomLog ${APACHE_LOG_DIR}/site2_access.log combined
</VirtualHost>

14.3 security.conf

# Changing the following options will not really affect the security of the
# server, but might make attacks slightly more difficult in some cases.

#
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of:  Full | OS | Minimal | Minor | Major | Prod
# where Full conveys the most information, and Prod the least.
#ServerTokens Minimal
ServerTokens Prod
#ServerTokens Full

#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#ServerSignature Off
ServerSignature Off

#
# Allow TRACE method
#
# Set to "extended" to also reflect the request body (only for testing and
# diagnostic purposes).
#
# Set to one of:  On | Off | extended
TraceEnable Off
#TraceEnable On

#
# Forbid access to version control directories
#
# If you use version control systems in your document root, you should
# probably deny access to their directories.
#
# Examples:
#
#RedirectMatch 404 /\.git
#RedirectMatch 404 /\.svn

#
# Setting this header will prevent MSIE from interpreting files as something
# else than declared by the content type in the HTTP headers.
# Requires mod_headers to be enabled.
#
#Header set X-Content-Type-Options: "nosniff"

#
# Setting this header will prevent other sites from embedding pages from this
# site as frames. This defends against clickjacking attacks.
# Requires mod_headers to be enabled.
#
#Header set Content-Security-Policy "frame-ancestors 'self';"

15. まとめ

本記事では、Apacheを使用したWebサーバの構築を実践しました。

15.1 達成できたこと

✅ Apacheのインストールと起動
✅ Virtual Hostによる複数サイトの同時運用
✅ Basic認証によるアクセス制御
✅ 自己署名証明書を用いたHTTPS通信の実装
✅ セキュリティヘッダーの設定
✅ HTTPからHTTPSへの自動リダイレクト

15.2 学んだ技術要素

技術要素 詳細
Virtual Host 1つのサーバで複数のWebサイトをホスティング
Basic認証 ユーザー名とパスワードによるアクセス制限
SSL/TLS 通信の暗号化とHTTPS化
自己署名証明書 開発環境でのHTTPS通信の実現
セキュリティヘッダー XSS、クリックジャッキング等の攻撃対策

16. 参考文献


付録A: OpenSSLコマンド一覧

証明書管理に役立つOpenSSLコマンドをまとめます。

秘密鍵の操作

# RSA秘密鍵の生成(2048bit)
openssl genrsa -out private.key 2048

# RSA秘密鍵の生成(4096bit、より安全)
openssl genrsa -out private.key 4096

# パスフレーズ付き秘密鍵の生成
openssl genrsa -aes256 -out private.key 2048

# 秘密鍵からパスフレーズを削除
openssl rsa -in encrypted.key -out decrypted.key

# 秘密鍵の詳細情報表示
openssl rsa -in private.key -text -noout

# 秘密鍵のモジュラス確認
openssl rsa -in private.key -noout -modulus

# 秘密鍵から公開鍵を抽出
openssl rsa -in private.key -pubout -out public.key

証明書署名要求(CSR)の操作

# CSRの生成(対話式)
openssl req -new -key private.key -out request.csr

# CSRの生成(設定ファイル使用)
openssl req -new -key private.key -out request.csr -config openssl.cnf

# CSRの内容確認
openssl req -in request.csr -text -noout

# CSRのサブジェクト情報のみ表示
openssl req -in request.csr -noout -subject

# CSRの検証
openssl req -in request.csr -noout -verify

証明書の操作

# 自己署名証明書の生成(CSRから)
openssl x509 -req -days 365 -in request.csr -signkey private.key -out certificate.crt

# 自己署名証明書の生成(一発生成)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout private.key -out certificate.crt

# 証明書の詳細情報表示
openssl x509 -in certificate.crt -text -noout

# 証明書の有効期限確認
openssl x509 -in certificate.crt -noout -dates

# 証明書のサブジェクト情報確認
openssl x509 -in certificate.crt -noout -subject

# 証明書の発行者情報確認
openssl x509 -in certificate.crt -noout -issuer

# 証明書のシリアル番号確認
openssl x509 -in certificate.crt -noout -serial

# 証明書のフィンガープリント確認
openssl x509 -in certificate.crt -noout -fingerprint -sha256

# 証明書のモジュラス確認
openssl x509 -in certificate.crt -noout -modulus

# PEM形式からDER形式への変換
openssl x509 -in certificate.crt -outform DER -out certificate.der

# DER形式からPEM形式への変換
openssl x509 -in certificate.der -inform DER -out certificate.crt

SSL/TLS接続のテスト

# SSLサーバへの接続テスト
openssl s_client -connect example.com:443

# SNI(Server Name Indication)を指定して接続
openssl s_client -connect example.com:443 -servername example.com

# 証明書チェーンの確認
openssl s_client -connect example.com:443 -showcerts

# 特定のTLSバージョンで接続
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_3

# タイムアウト設定付きで接続
openssl s_client -connect example.com:443 -timeout 10

# 証明書の有効期限をリモートサーバで確認
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

証明書と秘密鍵の整合性確認

# 秘密鍵のMD5ハッシュ
openssl rsa -in private.key -noout -modulus | openssl md5

# CSRのMD5ハッシュ
openssl req -in request.csr -noout -modulus | openssl md5

# 証明書のMD5ハッシュ
openssl x509 -in certificate.crt -noout -modulus | openssl md5

# 3つのハッシュが一致すれば、秘密鍵・CSR・証明書は対応している

その他の便利なコマンド

# ランダムなパスワード生成(16文字)
openssl rand -base64 16

# ランダムなパスワード生成(32文字)
openssl rand -base64 32

# ファイルのハッシュ値計算(SHA256)
openssl dgst -sha256 file.txt

# ファイルの暗号化(AES256)
openssl enc -aes-256-cbc -salt -in file.txt -out file.txt.enc

# ファイルの復号化
openssl enc -aes-256-cbc -d -in file.txt.enc -out file.txt

# Base64エンコード
echo "Hello World" | openssl base64

# Base64デコード
echo "SGVsbG8gV29ybGQK" | openssl base64 -d

# 証明書の有効期限切れチェック(スクリプト向け)
openssl x509 -in certificate.crt -noout -checkend 86400
# 終了コード 0: まだ有効、1: 24時間以内に期限切れ

PKCS#12形式の操作

# PEMからPKCS#12への変換
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt

# PKCS#12からPEMへの変換
openssl pkcs12 -in certificate.pfx -out certificate.pem -nodes

# PKCS#12の内容確認
openssl pkcs12 -in certificate.pfx -info

付録B: コマンド一覧

よく使うコマンドをまとめます。

Apache関連

# Apache関連
sudo systemctl start apache2      # 起動
sudo systemctl stop apache2       # 停止
sudo systemctl restart apache2    # 再起動
sudo systemctl reload apache2     # 設定リロード(接続を切らずに設定反映)
sudo systemctl status apache2     # 状態確認
sudo systemctl enable apache2     # 自動起動有効化
sudo systemctl disable apache2    # 自動起動無効化
sudo apache2ctl configtest        # 設定の構文チェック
sudo apache2ctl -M               # 有効なモジュール一覧表示
sudo apache2ctl -S               # Virtual Host設定一覧表示
sudo apache2ctl -V               # Apacheバージョンとコンパイルオプション表示

サイトとモジュールの管理

# サイトの有効化/無効化
sudo a2ensite site1.conf         # 有効化
sudo a2dissite site1.conf        # 無効化
sudo a2ensite *.conf            # すべてのサイトを有効化

# モジュールの有効化/無効化
sudo a2enmod ssl                 # 有効化
sudo a2dismod ssl                # 無効化
sudo a2enmod rewrite headers     # 複数モジュールを同時に有効化

# 設定ファイルの有効化/無効化
sudo a2enconf security           # 有効化
sudo a2disconf security          # 無効化

ログの確認

# ログの確認
sudo tail -f /var/log/apache2/error.log              # エラーログをリアルタイム監視
sudo tail -f /var/log/apache2/access.log             # アクセスログをリアルタイム監視
sudo tail -100 /var/log/apache2/error.log            # エラーログの最新100行表示
sudo grep "error" /var/log/apache2/error.log         # エラーのみ抽出
sudo grep "404" /var/log/apache2/access.log          # 404エラーのみ抽出
sudo tail -f /var/log/apache2/site1_access.log       # 特定サイトのログ監視

# ログローテーション後のログ確認
sudo zcat /var/log/apache2/access.log.2.gz | tail -100  # 圧縮されたログの確認

パスワードファイルの管理

# パスワードファイルの管理
sudo htpasswd -c /path/.htpasswd user1   # 新規作成(-cオプション付き)
sudo htpasswd /path/.htpasswd user2      # ユーザー追加
sudo htpasswd -D /path/.htpasswd user1   # ユーザー削除
sudo htpasswd -v /path/.htpasswd user1   # パスワード検証
cat /path/.htpasswd                      # 登録ユーザー一覧表示

OpenSSL関連

# SSL証明書の確認
sudo openssl x509 -in /path/cert.crt -text -noout           # 証明書詳細表示
sudo openssl x509 -in /path/cert.crt -noout -dates          # 有効期限確認
sudo openssl x509 -in /path/cert.crt -noout -subject        # サブジェクト確認
sudo openssl rsa -in /path/key.key -text -noout             # 秘密鍵詳細表示

# SSL接続テスト
openssl s_client -connect domain:443 -servername domain     # SSL接続確認
openssl s_client -connect localhost:443 -servername site2.local  # ローカルテスト

# 証明書と秘密鍵の整合性確認
sudo openssl rsa -in /path/key.key -noout -modulus | openssl md5
sudo openssl x509 -in /path/cert.crt -noout -modulus | openssl md5

ネットワーク確認

# ポート使用状況確認
sudo netstat -tlnp | grep apache2       # Apacheが使用中のポート確認
sudo netstat -tlnp | grep :80           # ポート80の使用状況
sudo netstat -tlnp | grep :443          # ポート443の使用状況
sudo ss -tlnp | grep apache2            # ss コマンドでの確認(高速)

# プロセス確認
ps aux | grep apache2                   # Apacheプロセス確認
pgrep -a apache2                        # Apacheプロセス一覧

# ファイアウォール確認
sudo ufw status                         # UFWの状態確認
sudo ufw status numbered                # ルール番号付きで表示
sudo iptables -L -n                     # iptablesのルール確認

ファイル・ディレクトリ操作

# パーミッション設定
sudo chown -R www-data:www-data /var/www/site1   # 所有権変更
sudo chmod -R 755 /var/www/site1                 # パーミッション変更
sudo chmod 640 /etc/apache2/.htpasswd            # 認証ファイルの権限設定
sudo chmod 600 /etc/apache2/ssl/server.key       # 秘密鍵の権限設定

# ディスク使用量確認
du -sh /var/www/*                       # 各サイトの容量確認
du -sh /var/log/apache2/*              # ログファイルの容量確認
df -h                                   # ディスク全体の使用状況

便利なワンライナー

# 特定IPからのアクセス数をカウント
sudo grep "192.168.1.100" /var/log/apache2/access.log | wc -l

# アクセス数の多いIPアドレス Top 10
sudo awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10

# ステータスコード別のアクセス数
sudo awk '{print $9}' /var/log/apache2/access.log | sort | uniq -c | sort -rn

# 最もアクセスされたページ Top 10
sudo awk '{print $7}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10

# リアルタイムでアクセスを監視(IPアドレスとURL)
sudo tail -f /var/log/apache2/access.log | awk '{print $1, $7}'

# 証明書の有効期限まで残り日数を計算
echo $(( ($(date -d "$(openssl x509 -in /etc/apache2/ssl/server.crt -noout -enddate | cut -d= -f2)" +%s) - $(date +%s)) / 86400 )) days

付録C: ディレクトリとファイルの完全なパス一覧

/var/www/
├── html/
│   └── index.html (Apacheデフォルトページ)
├── site1/
│   └── index.html
└── site2/
    └── index.html

/etc/apache2/
├── apache2.conf (メイン設定ファイル)
├── sites-available/
│   ├── 000-default.conf
│   ├── site1.conf
│   └── site2.conf
├── sites-enabled/
│   ├── site1.conf -> ../sites-available/site1.conf
│   └── site2.conf -> ../sites-available/site2.conf
├── mods-enabled/
│   ├── ssl.conf -> ../mods-available/ssl.conf
│   ├── ssl.load -> ../mods-available/ssl.load
│   ├── rewrite.load -> ../mods-available/rewrite.load
│   └── headers.load -> ../mods-available/headers.load
├── ssl/
│   ├── server.crt
│   └── server.key
├── .htpasswd
└── conf-available/
    └── security.conf

/var/log/apache2/
├── access.log
├── error.log
├── site1_access.log
├── site1_error.log
├── site2_access.log
├── site2_error.log
├── site2_redirect_access.log
└── site2_redirect_error.log

/etc/hosts

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?