
Cowrie、Loki、Promtail、Grafanaを使用して構築された中程度の対話型SSH/Telnetハニーポット - GitLab CI検証パイプラインを使用してTerraform経由でDigitalOcean上にプロビジョニング。
Terraformを使用してDigitalOceanのドロップレット上にデプロイされたSSH/Telnetハニーポットスタック。攻撃はCowrieによってキャプチャされ、Lokiに保存され、Grafanaで攻撃元のライブワールドマップと共に可視化されます。
honeypot/
├── cowrie/
│ └── etc/
│ ├── cowrie.cfg # Cowrie honeypot configuration
│ └── userdb.txt # Accepted and rejected fake credentials
├── geoip/
│ └── .gitkeep # Placeholder - MMDB files are gitignored
├── grafana/
│ ├── provisioning/
│ │ ├── dashboards/
│ │ │ ├── dashboards.yml # Provisioning: dashboard provider
│ │ │ └── honeypot-dashboard.json # Pre-built Attack Monitor dashboard
│ │ └── datasources/
│ │ └── loki.yml # Auto-provisioned Loki datasource
│ └── grafana.ini # Grafana server settings
├── loki/
│ └── config.yml # Loki single-binary config and retention
├── promtail/
│ └── config.yml # Promtail scrape and GeoIP pipeline
├── scripts/
│ ├── geoip-update.sh # Download or refresh GeoIP database
│ └── setup-firewall.sh # Host UFW rules for honeypot ports
├── terraform/
│ ├── templates/
│ │ ├── cloud-init.yaml.tftpl # Droplet first-boot script (Terraform-templated)
│ │ └── env.tftpl # .env lines embedded via Terraform
│ ├── backend.tf # Terraform backend config
│ ├── main.tf # Droplet, SSH key, firewall, cloud-init
│ ├── outputs.tf # IPs and helpful post-apply values
│ ├── terraform.tfvars.example # Example variable values (copy to terraform.tfvars)
│ ├── variables.tf # Terraform input variables
│ └── versions.tf # Terraform and provider version constraints
├── .env.example # Example environment file for manual setup
├── .gitignore # Ignored paths and files
├── .gitlab-ci.yml # CI/CD pipeline: fmt, validate, Checkov
├── docker-compose.yml # Docker Compose file for the honeypot stack
├── LICENSE # GPLv2 license
├── manual-deployment.sh # Legacy VM bootstrap without Terraform
└── README.md # Project documentation
## ハードウェア要件
> 注意: これらの要件は2026年5月時点のDigitalOcean Basic Dropletプランに基づくもので、プロジェクトを実行するための最小要件です。
- プロバイダー: DigitalOcean
- プラン: Basic Droplet - 1 Intel vCPU
- RAM: 1 GB (+2 GB スワップ)
- ストレージ: 35 GB NVMe SSD
- OS: Ubuntu 24.04 LTS
## インストールとセットアップ
> 注意: インストール後は、新しい端末を開いて `ADMIN_SSH_PORT` (デフォルト: 2022) でまだSSH接続できることを確認してから、元のセッションを閉じることをお勧めします。
### Terraform によるデプロイ (推奨)
1. 読み取り/書き込み権限を持つDigitalOcean APIトークンを作成します:
- DigitalOceanにログインし、Account > API > Tokens > Generate New Token に移動します。
- トークンに名前を付け(例: "Cowrie Honeypot")、"Full Access"権限を選択します。
- "Generate Token"をクリックし、トークンの値を安全な場所にコピーします(後で確認できなくなります)。
2. ローカルマシンでSSH鍵ペアを作成し、公開鍵のパスをコピーします。
3. `terraform`ディレクトリに移動し、変数ファイルをコピーして編集します:
> 注意: 適用前に `terraform.tfvars` で少なくとも `do_token`、`ssh_public_key_path`、`grafana_admin_password` を設定する必要があります。```bash
cd terraform
cp terraform.tfvars.example terraform.tfvars
注: Terraform がローカルマシンにインストールされている必要があります。手順については、Terraform Installation Guide を参照してください。```bash terraform init # Initialize Terraform and download providers terraform apply
5. テスト中の場合 - 置き換えで再デプロイ:```bash
terraform apply -replace="digitalocean_droplet.honeypot"
### 手動デプロイメント(レガシー)
1. 上記のハードウェア要件とあなたのSSHキーを備えたDigitalOceanドロップレットを作成します。
2. ドロップレットにSSH接続するか、DigitalOceanウェブコンソールを使用して、以下のコマンドを実行します。```bash
ssh root@<your-droplet-ip> # If using DigitalOcean web console, skip this command
git clone https://gitlab.com/Oseguera12/cowrie-honeypot-digitalocean.git /opt/honeypot
cd /opt/honeypot
cp .env.example .env
nano .env
bash manual-deployment.sh
注: デフォルトでは、Terraformは状態をローカルマシンの
terraform/terraform.tfstateに書き込みます。このファイルには機密性の高い出力値(ドロップレットIP、Grafanaパスワード、SSHキーフィンガープリント)が含まれており、絶対にコミットしてはいけません。.gitignoreは*.tfstateと*.tfstate.*をカバーしています。
ローカル状態のリスク:
apply 実行が同時に行われるとファイルが破損する可能性がある個人の実験環境を超える場合は、リモートバックエンドに切り替えてください。terraform/backend.tf には、DigitalOcean Spacesの設定(S3互換)がコメントアウトされています。
リモートバックエンドを有効にするには:
terraform.tfvars には記述しないでください): ```bash
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
terraform/backend.tf 内の backend "s3" ブロックのコメントを解除し、バケット名とリージョンエンドポイントを入力します。terraform init -migrate-state を実行して、既存のローカルステートを Spaces に移行します。.gitlab-ci.yml は、プッシュのたびに単一の validate ステージで 3 つのジョブを実行します。
| ジョブ | ツール | 目的 |
|---|---|---|
terraform:fmt | hashicorp/terraform:1.8 | フォーマット: いずれかのファイルが terraform fmt を必要とする場合に失敗します |
terraform:validate | hashicorp/terraform:1.8 | DigitalOcean に問い合わせずに設定の妥当性を検証します |
checkov:scan | bridgecrew/checkov:latest | Terraform コード内の IaC の設定ミスをチェックします |
注:
terraform:fmtとterraform:validateは失敗するとパイプラインをブロックします。checkov:scanはallow_failure: trueに設定されています。これは一部の検出結果が意図的なトレードオフであるためです。ジョブ全体を無効にするのではなく、許容できる特定の検出結果については、インラインの# checkov:skip=CKXXXコメントで抑制してください。
CKV_DIO_4(「ファイアウォールの受信が完全に開いていないことを確認」)は、digitalocean_firewall リソース全体に対して 1 回発生します。これは terraform/main.tf のリソースブロック内に配置された単一の # checkov:skip=CKV_DIO_4: コメントで抑制されています。以下の表は、各開放ポートが意図的である理由を示しています。