Macのセキュリティチェックガイド

# 趣旨
自分のMacが誰かに攻撃されていないか確認できないことにはセキュリティの向上など見込めないなと考えたのでGPT先生にそのためのコマンドを教えてもらいました。

そもそもどれが悪意のあるものかを識別する能力は必要ぽいですが、ハッキングを受けてるかどうかも全く確認できない状況よりかはマシかと思います。

## 1. ユーザーアカウントの確認

システムに存在するユーザーアカウントのリストを取得します。

```bash
dscl . list /Users
```
このコマンドを実行することで、システム上に存在するすべてのユーザーアカウントを一覧表示できます。これにより、不審なユーザーアカウントがないか確認できます。特に、知らないユーザーアカウントが存在する場合、そのアカウントが不正に作成されたものである可能性があります。

## 2. プロセスの確認

現在実行中の全プロセスを表示します。

```bash
ps aux
```
このコマンドを実行することで、現在システム上で実行中のすべてのプロセスを詳細に一覧表示できます。これにより、CPUやメモリの使用状況、各プロセスの実行ユーザー、実行中のコマンドなどを確認できます。不審なプロセスが実行されていないかチェックし、不要なプロセスや不正なプロセスがあれば、それを特定して対処することができます。

:::note alert
チェックすべき項目
- 未知のプロセス名: 知らないプロセス名が存在するかどうかを確認する
- 異常なリソース使用量: 異常に高いCPU使用率やメモリ使用率を持つプロセスがないか確認する
- 実行ユーザー: 不正なユーザーが実行しているプロセスがないか確認する
- プロセスの場所: 通常のディレクトリ（例: /Applications, /System/Library）以外から実行されているプロセスをチェックする
:::

## 3. chrootkitでスキャン
システムにインストールされているRootkitを検出するためのツールです。Rootkitは、不正なアクセスや活動を隠蔽するために設計されたソフトウェアです。通常、攻撃者がシステムに侵入した後、その存在を隠すためにインストールされます。

### Recovery Modeでの準備

1. chkrootkit のインストール:
    `brew install chkrootkit`

2. System Integrity Protection (SIP) の状態確認:
    `csrutil status`

3. SIPの無効化:
    `csrutil disable`

4. Macを再起動し、Command (⌘) + R キーを押してRecovery Modeで起動します。

5. Rootkitのチェック:
    `sudo chkrootkit`

6. 再度Recovery Modeで起動し、SIPを有効化:
    `csrutil enable`

7. Macを再起動します

## 4. SIPの確認

System Integrity Protectionの状態を確認します。

```bash
sudo /usr/sbin/system_profiler SPSoftwareDataType | grep "System Integrity Protection"
```
以下の結果になると思います。
```bash
System Integrity Protection: Enabled
```

## 5. ログインアイテムの確認

現在のログインアイテムを取得します。Macを起動してログインしたらそれと同時に実行されるアプリのリストが得られます。

```bash
osascript -e 'tell application "System Events" to get the name of every login item'
```
このコマンドを実行することで、ログイン時に自動的に起動するアプリケーションのリストを取得できます。不審なアプリが含まれていないかを確認します。



## 6. エラーログの確認

過去24時間のエラーログを表示します。とても長いリストになるのでCtl+Cでカットしてもいいと思います。

```bash
log show --predicate 'eventMessage contains "error"' --info --last 24h
```
このコマンドを実行することで、過去24時間のエラーログを確認できます。システムエラーや不審な活動が記録されていないかをチェックします。


## 7. ネットワーク接続の確認

特定のポートでリッスンしているプロセスや、確立されたTCP接続を確認します。

### ポート443でリッスンしているプロセスの確認
:::note info
ポート443は、HTTPS通信に使用される標準ポート。HTTPS（HyperText Transfer Protocol Secure）は、HTTP通信にTLS（Transport Layer Security）またはSSL（Secure Sockets Layer）を使用して暗号化を追加したプロトコルで、ウェブブラウジングやデータ転送の際にセキュアな通信を提供する
:::

```bash
lsof -i :443
```

僕はMacを使ってラズパイによくSSH接続してるのでポート22も確率されたTCP接続が表示されました。HTTPはポート80ですが、最近のブラウザではHTTPを採用しているサイトへのアクセスは警告を受けるので443だけで良いと思います。

### 確立されたTCP接続の確認
確立されたTCP接続は、現在アクティブなネットワーク接続を示し、データの送受信が行われていることを意味します。これを確認することで、不正な接続や予期しないネットワークアクティビティを発見できます。

以下のコマンドを使用して、現在確立されているTCP接続を一覧表示します。

```bash
sudo lsof -iTCP -sTCP:ESTABLISHED
```

:::note info
コマンド解説
- sudo: スーパーユーザー権限でコマンドを実行する
- lsof: "list open files" の略で、現在開かれているファイルやネットワーク接続を表示するコマンド
- -iTCP: TCPプロトコルに関連する接続をフィルタリングする
- -sTCP:ESTABLISHED: TCP接続の中でも確立された（ESTABLISHED）状態のものだけを表示する
:::

### ネットワーク統計の表示
ネットワーク統計を表示することで、システム全体のネットワーク接続の状態を確認できます。これには、リッスン中のポートや確立された接続、待機中の接続などが含まれます。

以下のコマンドを使用して、ネットワーク統計を表示します。
```bash
netstat -an
netstat -an | grep ESTABLISHED
```

:::note info 
コマンド解説
- netstat: ネットワーク統計情報を表示するコマンド
- -a: すべてのソケット（リッスン中のものも含む）を表示する
- -n: アドレスとポートを数値で表示します。名前解決を行わないため、結果が速く表示される
- grep ESTABLISHED: netstat -an の出力から、確立された接続（ESTABLISHED）のみをフィルタリングして表示する
:::

もし怪しい通信があればtcpdump や wireshark などのネットワークパケットキャプチャツールを使用して、通信内容を監視し、何が送受信されているかを確認します。必要であれば、ファイアウォールを設定して不要な外部接続を制限します。

## 8. 起動時の項目の確認

### システム全体の起動項目

/Library/StartupItems ディレクトリには、システム全体で共通の起動項目が格納されています。これらの項目は、システムの起動時に自動的に実行されるスクリプトやプログラムです。通常、ここにはシステム管理者が設定した起動項目が含まれます。

```bash
ls -la /Library/StartupItems
```

### ユーザーの起動エージェント

~/Library/LaunchAgents ディレクトリには、ユーザー固有の起動エージェントが格納されています。これらのエージェントは、ユーザーがログインしたときに自動的に実行されるスクリプトやプログラムです。通常、ユーザーアプリケーションによって設定されます。

```bash
ls -la ~/Library/LaunchAgents
```

### システム全体の起動エージェント
/Library/LaunchAgents ディレクトリには、システム全体で使用される起動エージェントが格納されています。これらのエージェントは、任意のユーザーがログインしたときに自動的に実行されるスクリプトやプログラムです。一般的には、システム管理者やシステムアプリケーションによって設定されます。

```bash
ls -la /Library/LaunchAgents
```

### システム全体の起動デーモン
/Library/LaunchDaemons ディレクトリには、システム全体で使用される起動デーモンが格納されています。これらのデーモンは、システムの起動時に自動的に実行されるバックグラウンドサービスやプロセスです。通常、システム管理者やシステムサービスによって設定されます。

```bash
ls -la /Library/LaunchDaemons
```

## セキュリティ関連設定の確認

さらにセキュリティチェックを強化するためのコマンドをいくつか追加します。

### ファイアウォールの状態確認

```bash
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode
```

無効だった場合は以下のコマンドで有効化できます。
```bash
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on
```
macOSのビルトインファイアウォールを有効にすることで、不正なアクセスをブロックし、システムを保護します。

ステルスモードを有効にすると、システムはping要求などのネットワークプローブに応答しなくなります。これにより、システムがネットワーク上で検出されにくくなります。

### 不正なSUIDファイルのチェック
SUID (Set User ID) は、特定の条件下でプログラムが実行される際に、その所有者の権限で実行されることを可能にするファイル属性です。攻撃者はこの機能を利用して権限昇格攻撃を試みることがあるため、不正なSUIDファイルがないか定期的にチェックすることが重要です。

```bash
find / -perm -4000
```
:::note info
コマンド解説
- find /: ルートディレクトリから始めて、全ファイルシステムを検索する
- -perm -4000: SUIDビットがセットされているすべてのファイルを検索する
:::
このコマンドを実行することで、SUIDビットが設定されているすべてのファイルのリストが表示されます。不審なファイルがないかを確認し、必要に応じて適切な対処を行います。


### システムログの確認
システムログは、システムイベントやエラーメッセージなどの情報を記録するファイルです。最近のシステムログを確認することで、異常な活動やエラーメッセージを検出することができます。

```bash
tail -n 50 /var/log/system.log
```
:::note info
コマンド解説
- tail: ファイルの末尾を表示するコマンド
- -n 50: 最後の50行を表示する
- /var/log/system.log: システムログファイルのパス
:::
### セキュリティパッチの状態確認
システムのセキュリティを維持するために、最新のセキュリティパッチが適用されているかを確認します。

```bash
softwareupdate --history
```

### Gatekeeperの設定確認
Gatekeeperは、未承認のアプリケーションの実行を防ぐmacOSのセキュリティ機能です。

```bash
spctl --status
```

### XProtectの状態確認
XProtectは、macOSに組み込まれたマルウェア対策機能です。

```bash
defaults read /System/Library/CoreServices/XProtect.bundle/Contents/Resources/XProtect.meta.plist
```

### システム設定の変更履歴の確認
システム設定の変更履歴を確認することで、設定の不正な変更がないかをチェックします。
```bash
ls -la /var/db/receipts
```
### 最近のログインの確認
最近のログイン履歴を確認することで、不審なログインがないかをチェックします。

```bash
last
```

### システム情報の詳細確認
システムの詳細情報を確認することで、ハードウェアやソフトウェアの変更がないかをチェックします。

```bash
system_profiler SPHardwareDataType SPSoftwareDataType
```
### ネットワーク設定の確認
現在のネットワーク設定を確認し、不審なネットワーク設定がないかをチェックします。

```bash
networksetup -listallhardwareports
```
### cronジョブとatジョブの確認
不審なcronジョブやatジョブが設定されていないかを確認します。

```bash
crontab -l
sudo crontab -l
atq
```
## まとめ

上記のコマンドを実行することで、Macのセキュリティ状態を包括的に確認できます。定期的にこれらのチェックを行い、システムの健全性を維持しましょう。