Ubuntu20.04 checklist

# Ubuntu check list
## 1. パスワードポリシーの設定
- パスワードの最小文字数、複雑さ、有効期限を設定する
1. 最小文字数の設定：パスワードの最小文字数を設定するには、以下のコマンドを使用します。
    ```
    bash
    sudo passwd -minlen [num]
    ```
    ここで、[num]は、設定したい最小文字数の値です。
1. 複雑さの設定：パスワードの複雑さを設定するには、以下のコマンドを使用します。
    ```
    bash
    sudo passwd -minlen [num] -d
    ```
    ここで、[num]は、設定したい最小文字数の値です。-dオプションは、パスワードの複雑さを有効にするためのものです。
1. 有効期限の設定：パスワードの有効期限を設定するには、以下のコマンドを使用します。
    ```
    bash
    sudo change -M [num] [username]
    ```
    ここで、[num]は、パスワードの有効期限の日数です。[username]は、パスワードの有効期限を設定したいユーザーの名前です。

- パスワードの再利用を制限する
1. パスワードポリシーの確認：まず、現在のパスワードポリシーを確認します。多くのLinuxシステムでは、パスワードポリシーは/etc/login.defsファイルに定義されています。
1. パスワードの再利用制限の設定：次に、再利用を制限するために、パスワード履歴を保持する必要があります。例えば、パスワード履歴を5世代保持する場合は、以下の設定を/etc/pam.d/common-passwordに追加します。
    ```
    # /etc/pam.d/common-password
    password required pam_unix.so remember=5
    ```
1. 再起動する：設定を反映するために、システムを再起動するか、パスワードを変更する必要があります。

- 不要なアカウントを削除する
1. アカウントの確認：まず、現在のシステムに存在するアカウントのリストを確認します。これには、有効なアカウントと無効なアカウントが含まれます。
    ```
    bash
    cut -d: -f1 /etc/passwd
    ```
1. アカウントの無効化：不要なアカウントを特定したら、以下のコマンドを使用してアカウントを無効化します。
    ```
    bash
    sudo usermod -L [ユーザー名]
    ```
    ここで、[ユーザー名]は、無効化するアカウントの名前です。
1. アカウントの削除：アカウントを完全に削除する場合は、以下のコマンドを使用してアカウントを削除します。
    ```
    bash
    sudo userdel -r [ユーザー名]
    ```
    ここで、-rオプションは、ユーザーホームディレクトリとメールボックスを削除するためのものです。
## 2. ファイアウォールの設定
- 不要なポートを閉じる
1. ufwのインストール: もしufwがインストールされていない場合は、以下のコマンドを使用してインストールしてください。
    ```
    bash
    sudo apt-get install ufw
    ```
1. 開いているポートの確認: どのポートが開いているかを確認するには、以下のコマンドを使用して現在のファイアウォールのステータスを表示します。
    ```
    bash
    sudo ufw status verbose
    ```
1. 不要なポートの閉鎖: 不要なポートを閉じるには、以下のコマンドを使用してポートをブロックします。
    ```
    bash
    sudo ufw deny [ポート番号]
    ```
1. ファイアウォールの有効化: 最後に、設定を有効化するために、以下のコマンドを使用してファイアウォールを有効化します。
    ```
    bash
    sudo ufw enable
    ```

- 適切な入力・出力ルールを設定する
1. 初期設定: まず、ファイアウォールを有効にする必要があります。以下のコマンドを使用して、ufwを有効にします。
    ```
    bash
    sudo ufw enable
    ```
1. 入力ルールの設定: 入力ルールを設定するには、以下のコマンドを使用して、必要なポートを開放します。
    ```
    bash
    sudo ufw allow [ポート番号]/[プロトコル]
    ```
    例えば、SSHのポート番号である22番を開放する場合は、以下のコマンドを使用します。
    ```
    bash
    sudo ufw allow 22/tcp
    ```
1. 出力ルールの設定: 出力ルールを設定するには、以下のコマンドを使用して、必要なポートを開放します。
    ```
    bash
    sudo ufw allow out [ポート番号]/[プロトコル]
    ```
    例えば、HTTPのポート番号である80番を開放する場合は、以下のコマンドを使用します。
    ```
    bash
    sudo ufw allow out 80/tcp
    ```
1. ルールの削除: 設定したルールを削除する場合は、以下のコマンドを使用して削除します。
    ```
    bash
    sudo ufw delete [ルール番号]
    ```
    例えば、SSHのポート番号である22番を削除する場合は、以下のコマンドを使用します。
    ```
    bash
    sudo ufw delete allow 22/tcp
    ```
- 不要なポートの具体例
1. Telnet (ポート番号23) - 暗号化されておらず、セキュリティリスクが高いため、SSHに置き換えることが推奨されています。
1. FTP (ポート番号20, 21) - 転送中のデータが暗号化されず、ログイン認証に平文のパスワードを使用するため、セキュリティリスクが高いため、SFTPに置き換えることが推奨されています。
1. SNMP (ポート番号161) - セキュリティ設定が弱く、攻撃者に管理情報を提供するため、必要でない場合は無効にすることが推奨されています。
1. SMB/CIFS (ポート番号139, 445) - ファイル共有サービスで、認証なしでアクセスできる場合があり、悪意のあるユーザーによって悪用される可能性があるため、必要でない場合は無効にすることが推奨されています。
1. RPC (ポート番号111) - リモートプロシージャコール (RPC) に使用され、セキュリティに欠けるため、必要でない場合は無効にすることが推奨されています。
1. NetBIOS (ポート番号137, 138) - Windowsベースのネットワークで使用される古いプロトコルで、UDP上で通信します。セキュリティに欠け、ワイヤレスネットワーク上で悪用されることがあります。
1. Finger (ポート番号79) - リモートユーザーの情報を取得するためのプロトコルで、悪意のあるユーザーによってスパムやDoS攻撃に悪用されることがあります。
1. Rexec (ポート番号512) - リモートの実行可能ファイルを実行するために使用されるプロトコルで、セキュリティに問題があるため、SSHやSCPに置き換えることが推奨されています。
1. LDAP (ポート番号389) - ディレクトリサービスに使用され、セキュリティに欠けるため、必要でない場合は無効にすることが推奨されています。
1. NTP (ポート番号123) - タイムサービスに使用され、不適切に構成されたNTPサーバーは、DoS攻撃のリフレクションに使用されることがあります。
## 3. システムアップデートの適用
- Ubuntuのパッケージリポジトリからアップデートを取得する
```
bash
sudo apt update
sudo apt upgrade
```
必要に応じて、'sudo apt dist-upgrade' コマンドを使用して、Ubuntuの新しいリリースにアップグレードすることもできます。このコマンドは、パッケージの依存関係を解決して、最新バージョンにアップグレードします。
- 不要なパッケージを削除する
不要なパッケージを削除するために、Ubuntuでは以下のコマンドを使用することができます。
```
bash
sudo apt autoremove
```
このコマンドは、依存関係のない古いパッケージを自動的に削除することができます。これにより、システムの不要なパッケージが削除され、ストレージスペースが解放されます。

また、特定のパッケージを手動で削除する場合は、以下のコマンドを使用します。
```
bash
sudo apt remove <package-name>
```
これにより、指定したパッケージが削除されます。ただし、依存関係がある場合は、関連するパッケージも削除される場合があります。必要なパッケージを誤って削除しないようにするために、事前に依存関係を確認することをお勧めします。
## 4. 不要なサービスの停止
- 不要なサービスを停止する
1. 'systemctl list-unit-files --type=service' コマンドを実行して、現在有効なサービスの一覧を表示します。
1. 停止したいサービスを特定します。
1. 'sudo systemctl stop <service-name>' コマンドを使用して、サービスを停止します。
1. 'sudo systemctl disable <service-name>' コマンドを使用して、サービスを自動起動から削除します。これにより、システムが再起動した際に、サービスが自動的に起動することを防ぎます。

- 不要なサービスの例
1. Bluetoothサービス - ブルートゥースを使用しない場合は、Bluetoothサービスを停止することができます。
1. Avahiデーモン - BonjourのようなマルチキャストDNSサービスを提供するためのサービスです。ネットワーク上で使用していない場合は、不要です。
1. NTPサービス - システム時刻を自動的に同期するためのサービスです。ネットワーク上で時間同期を行わない場合は、不要です。
1. CUPSサービス - プリンターサービスを提供するためのサービスです。プリンターを使用しない場合は、不要です。
1. NFSサービス - ファイル共有を提供するためのサービスです。ネットワーク上でファイル共有を行わない場合は、不要です。
1. Apache2サービス - Webサーバーを実行していない場合、Apache2サービスを無効にすることができます。
1. Postfixサービス - メールサーバーを実行していない場合、Postfixサービスを無効にすることができます。
1. Sambaサービス - Windowsファイル共有を実行していない場合、Sambaサービスを無効にすることができます。

- 起動時に自動で起動するサービスを削除する
Ubuntuでは、systemdを使用してサービスを管理しています。systemdは、自動的に起動するサービスを制御するために「enable」と「disable」のコマンドを提供しています。以下は、自動的に起動するサービスを削除する方法です。
1. 不要なサービスの確認：まず、自動的に起動するサービスを確認します。次のコマンドを使用します。
    ```
    bash
    systemctl list-unit-files --type=service --state=enabled
    ```
1. サービスの停止：サービスを手動で停止します。次のコマンドを使用します。
    ```
    bash
    sudo systemctl stop <service_name>
    ```
1. サービスの無効化：サービスを自動起動しないように設定します。次のコマンドを使用します。
    ```
    bash
    sudo systemctl disable <service_name>
    ```

注意：サービス名を指定する際には、正確な名前を使用する必要があります。また、システムが必要とするサービスを無効化すると、システムの動作に影響を与える可能性があるため、注意してください。

## 5. ファイルのセキュリティ設定
- ファイルのアクセス権を設定する
Ubuntuでは、ファイルやディレクトリのアクセス権を設定するために「chmod」コマンドを使用します。以下は、基本的なアクセス権の設定方法です。
1. アクセス権の確認：まず、アクセス権を確認します。次のコマンドを使用します。
    ```
    bash
    ls -l <file_name>
    ```
    これにより、所有者、グループ、パーミッションの情報が表示されます。
1. アクセス権の変更：「chmod」コマンドを使用して、アクセス権を変更します。次の例では、ファイル所有者に読み取り、書き込み、実行の権限を与え、グループと他のユーザーには読み取りの権限を与えます。
    ```
    bash
    chmod 755 <file_name>
    ```
1. アクセス権の変更結果の確認：変更後、再度「ls -l」コマンドを使用して、アクセス権が正しく設定されていることを確認します。

- rootアクセスを制限する
rootアクセスを制限する方法には、以下のような方法があります。
1. sudoを使用する
    sudoを使用することで、root権限が必要な操作を一時的に実行することができます。sudoを使用するには、sudoコマンドに続けて実行したいコマンドを入力します。例えば、以下のコマンドを実行することで、root権限が必要なファイルの編集を行うことができます。
    ```
    bash
    # 具体例としてsshの設定ファイルを書き換えている
    sudo nano /etc/ssh/sshd_config
    ```
1. rootログインを禁止する
    rootログインを禁止することで、root権限を持ったユーザーがログインできないようにすることができます。これにより、セキュリティ上のリスクを減らすことができます。rootログインを禁止するには、以下の手順を実行します。
    ```
    bash
    sudo vi /etc/ssh/sshd_config
    ```
    エディタに移動
    ```
    vi
    #PermitRootLogin yes
    から
    PermitRootLogin no
    に変更
    ```
    bashに移動
    ```
    bash
    sudo systemctl restart ssh
    ```

1. rootアカウントを無効にする
    rootアカウントを無効にすることで、root権限を持ったユーザーが存在しない状態にすることができます。これにより、セキュリティ上のリスクを減らすことができます。rootアカウントを無効にするには、以下の手順を実行します。

    - rootアカウントにパスワードを設定する。
    ```
    bash
    sudo passwd root
    ```
    - rootアカウントを無効にする。
    ```
    bash
    sudo usermod --expiredate 1 root
    ```
    
    これにより、rootアカウントは無効になりますが、root権限が必要な場合は、sudoを使用することで実行することができます。
## 6. ウイルス対策ソフトのインストール
- ウイルス対策ソフトをインストールする
    Ubuntuは通常、ウイルス対策ソフトウェアをインストールする必要はありません。Linuxは、デフォルトで多層のセキュリティ機能が組み込まれており、ウイルスの脅威に対する高い抵抗力を持っています。

    ただし、システムのセキュリティをより強化したい場合や、特定のファイルやディレクトリをウイルススキャンしたい場合は、ClamAVというウイルススキャンソフトウェアをインストールすることができます。

    ClamAVをインストールするには、以下のコマンドを使用します。
    ```
    bash
    sudo apt-get update
    sudo apt-get install clamav
    ```
    インストール後、ClamAVはCLIベースのツールであるため、コマンドラインから使用する必要があります。例えば、次のコマンドでファイルをスキャンできます。

    ```
    bash
    clamscan /path/to/file/or/directory
    ```
    ただし、ClamAVを実行する前に、システム上のすべてのパッケージが最新であることを確認し、システムのファイルを変更する前にバックアップを作成することをお勧めします。

- 定期的にウイルススキャンを実行する
Ubuntuには、ClamAVを使用して定期的に自動的にウイルススキャンを実行するための簡単な方法があります。以下の手順に従ってください。
1. cronを使用して、定期的にウイルススキャンを実行する新しいスクリプトファイルを作成します。たとえば、スクリプトファイルを /usr/local/bin/clamscan.shに保存します。
1. スクリプトファイルを編集し、以下のような内容を追加します。
    ```
    bash
    #!/bin/sh
    LOGFILE="/var/log/clamav/clamav-$(date +'%Y-%m-%d').log";
    EMAIL_MSG="Please see the log file attached.";
    EMAIL_FROM="clamav-daemon@example.com";
    EMAIL_TO="admin@example.com";
    DIRTOSCAN="/home /var/www /tmp";
    /usr/bin/clamscan -i -r $DIRTOSCAN --exclude-dir=^/sys --exclude-dir=^/proc --exclude-dir=^/dev 2>> $LOGFILE;
    if [ $? -eq 1 ]; then
        echo "Virus detected in file(s). Please check the log file." | /usr/bin/mail -a $LOGFILE -s "ClamAV: Virus detected" -r $EMAIL_FROM $EMAIL_TO;
    else
        echo "No virus found." | /usr/bin/mail -s "ClamAV: No virus found" -r $EMAIL_FROM $EMAIL_TO;
    fi
    ```
    このスクリプトは、ログファイルを作成し、指定されたディレクトリツリーのウイルススキャンを実行します。また、ログファイルに結果を書き込み、結果に基づいてメールを送信します。
1. スクリプトファイルに実行権限を与えます。
    ```
    bash
    sudo chmod +x /usr/local/bin/clamscan.sh
    ```
1. cronジョブを作成して、スクリプトファイルを定期的に実行します。
    ```
    sudo crontab -e
    ```
    エディタが開くので、以下のようにスクリプトファイルを追加します。
    ```
    cron
    0 0 * * * /usr/local/bin/clamscan.sh
    ```
    この例では、毎日の深夜にウイルススキャンが実行されます。スケジュールを変更するには、cronのマニュアルページを参照してください。
これで、定期的に自動的にウイルススキャンが実行されます。ただし、システム上のすべてのパッケージが最新であることを確認し、システムのファイルを変更する前にバックアップを作成することをお勧めします。
## 7. ログの監視
- システムログを監視する
1. ログの場所を確認する
    - Ubuntu 20.04では、主要なログは /var/log ディレクトリに保存されます。
    - /var/log/syslog ファイルには、システム全体のログが含まれています。
1. ログの閲覧方法を選択する
    - テキストエディタを使用してログファイルを開くことができます。
    - tail コマンドを使用して、ログファイルの最後の行を表示することができます。
    - less コマンドを使用して、ログファイル全体を閲覧することができます。
    - grep コマンドを使用して、キーワードを検索することができます。
1. ログを自動的に監視する
    - logwatch ツールを使用して、ログを定期的に監視し、変更や重要な情報を報告することができます。
    - rsyslog デーモンを使用して、ログファイルをリモートサーバーに転送することができます。
    - auditd デーモンを使用して、システムイベントを監視することができます。

- 不審なログイン試行やアクセスを監視する
1. SSHログインの監視
    - SSHログインにはセキュアな鍵認証方式を使用することを推奨します。パスワードを使用する場合は、強力なパスワードポリシーを設定することが必要です。
    - SSHログインには、失敗したログイン試行の記録を残すように設定することができます。その方法は以下の通りです。

        1. ルートユーザーでログインし、以下のコマンドを使用してsshd_configファイルを開きます。
        1. ファイルの最後に、以下の行を追加します。
            ```
            bash
            LogLevel VERBOSE
            ```
            これにより、sshdデーモンは、接続トラブルの詳細なログを/var/log/auth.logファイルに記録するようになります。
        1. ファイルを保存して閉じます。
        1. sshdデーモンを再起動して、変更を反映させます。
            ```
            bash
            sudo systemctl restart sshd
            ```
        これで、ログインに失敗した試行に関する情報が/var/log/auth.logに記録されるようになります。それにより、不正なログイン試行を特定することができます。
    - SSHログインには、ログインに使用されたユーザー名とIPアドレスを記録することもできます。その方法は以下の通りです。これにより、不正なログイン試行の元凶を特定することができます。
        1. ルートユーザーでログインし、以下のコマンドを使用してsshd_configファイルを開きます。
        1. ファイルの最後に、以下の行を追加します。
            ```
            bash
            LogLevel VERBOSE
            ```
            これにより、sshdデーモンは、接続トラブルの詳細なログを/var/log/auth.logファイルに記録するようになります。
        1. ファイルを保存して閉じます。
        1. sshdデーモンを再起動して、変更を反映させます。
            ```
            bash
            sudo systemctl restart sshd
            ```
        これで、SSHログインに使用されたユーザー名とIPアドレスを記録する設定が完了します。

1. アプリケーションログの監視
    - サーバーアプリケーションが生成するログファイルを監視することが必要です。
    - ログファイルは、一定の頻度で定期的に監視する必要があります。また、ログファイルをリアルタイムで監視することもできます。これにより、不正なアクセスや攻撃をリアルタイムで検出することができます。

        Logwatchは、Linuxシステム上で実行されるツールの1つで、ログファイルからシステムの活動に関するレポートを作成することができます。Logwatchは、様々なログファイルを監視して、システムの状態に関するレポートを作成することができます。以下は、logwatchを使ってサーバーアプリケーションが生成するログファイルを監視する手順です。
        1. Logwatchのインストール
            ```
            bash
            sudo apt-get update
            sudo apt-get install logwatch
            ```
        1. Logwatchの設定
            - Logwatchの設定は、'/usr/share/logwatch/default.conf/logwatch.conf'ファイルを編集することで行えます。
            - 例えば、以下のように設定を変更することができます。
                MailTo ：レポートを送信するメールアドレスを設定します。
                Detail ：レポートの詳細レベルを設定します。詳細なレポートを作成するには、Highを選択します。
                Service ：監視するサービスの種類を設定します。例えば、apache、mysql、postfixなどがあります。
        1. Logwatchの実行
            - Logwatchは、cronジョブとして設定されており、毎日自動的に実行されます。
            - 手動で実行する場合は、以下のコマンドを使用します。
                ```
                bash
                sudo logwatch
                ```
        以上の手順に従うことで、Logwatchを使用してサーバーアプリケーションが生成するログファイルを監視し、システムの活動に関するレポートを作成することができます。

    - ログファイルの保管には、ログファイルの暗号化や、ログファイルを保管するストレージ領域のセキュリティ設定を行うことが必要です。
        - ログファイルの暗号化
            1. ログファイルを定期的にバックアップする。
            1. バックアップファイルを暗号化するためのツールを使用する。例えば、GnuPGやopensslなどが利用できます。
            1. 暗号化に使用する公開鍵/秘密鍵ペアを生成する。
            1. 公開鍵をログファイルの暗号化に使用するために、サーバー上で公開する。
            1. バックアップファイルを暗号化するために、サーバー上で秘密鍵を使用して暗号化する。
            1. 暗号化されたログファイルを、安全な場所に保存する。
        - ログファイルを保管するストレージ領域のセキュリティ設定
            1. ファイルシステムのアクセス権限の設定: ログファイルを保管するディレクトリやファイルに、適切なアクセス権限を設定することで、不正なアクセスから保護します。一般的に、ログファイルは特定のユーザーまたはグループにのみ読み取り/書き込み権限を与えます。
            1. ログファイルの暗号化: ログファイルを暗号化することで、機密性を高め、不正なアクセスから保護します。ログファイルの暗号化には、オペレーティングシステムやサードパーティの暗号化ツールを使用することができます。
            1. ストレージ領域の監視: ログファイルが保管されているストレージ領域を監視し、不正なアクセスや変更があった場合には、迅速に対応する必要があります。ストレージ領域の監視には、セキュリティ情報やログ情報を収集するための専用ツールが利用できます。
            1. ログファイルのバックアップ: ログファイルのバックアップを定期的に作成することで、ファイルが紛失、破損、または不正にアクセスされた場合に、復旧が可能になります。バックアップには、複数のメディアを使用することが推奨されます。
1. インターネット接続の監視(たぶんサーバ向け)
    - サーバーに接続されているネットワークデバイスの通信を監視することが必要です。これにより、不正なアクセスや攻撃の痕跡を検出することができます。
    - パケットフィルタリングソフトウェアやインラインセキュリティアプライアンスを使用して、不正なアクセスや攻撃をリアルタイムで検出することができます。
## 8. バックアップの設定
- バックアップを定期的に実行する
- バックアップ先を暗号化する

    ＜参考文献    2023/03/24 参照＞
    https://blog.inagaki.in/post/ubuntu-periodical-backup/
    https://www.dell.com/support/kbdoc/ja-jp/000152034/ubuntu-linux%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%87%E3%83%ABpc%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-%E8%8B%B1%E8%AA%9E

## 9. 不正なアクセスの検出
- 不正なアクセスを検出するための監視を設定する
    1. ログの監視: システムログやアプリケーションログなどのログを監視し、不審なアクティビティを検知することができます。ログの監視には、LogwatchやLogrotateなどのツールを使用することができます。
    1. インライン監視: インライン監視は、ネットワークトラフィックをリアルタイムで監視し、不審なトラフィックを検知することができます。SnortやSuricataなどのネットワークセキュリティツールを使用することができます。
    1. ファイルシステム監視: ファイルシステム監視は、ファイルシステムの変更を監視し、不正な変更を検知することができます。TripwireやAIDEなどのツールを使用することができます。
    1. 脆弱性スキャン: 脆弱性スキャンは、システムやアプリケーションの脆弱性をスキャンし、検出された脆弱性に対して適切な対策を講じることができます。OpenVASやNessusなどの脆弱性スキャナを使用することができます。

- セキュリティインシデントに対する対応プロセスを確立する。