{
  "id": "Y4SJP07CnkFr6gvM",
  "meta": {
    "site": "https://github.com/zengfr/n8n-workflow-all-templates",
    "name": "Monitor Remote Server File Integrity with SSH and Slack Alerts",
    "wechat": "youandme10086",
    "id": 6814,
    "update_time": "2025-11-10"
  },
  "name": "Automated File Integrity Check with Slack",
  "tags": [],
  "nodes": [
    {
      "id": "a56ca493-a82b-45db-bc81-90c9d9368646",
      "name": "Scheduled Check",
      "type": "n8n-nodes-base.cron",
      "position": [
        -416,
        352
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "334491fa-dfe6-4502-b704-1f852639b2cc",
      "name": "List Files & Checksums",
      "type": "n8n-nodes-base.code",
      "position": [
        -192,
        352
      ],
      "parameters": {
        "jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor (const item of $input.all()) {\n  item.json.myNewField = 1;\n}\n\nreturn $input.all();"
      },
      "typeVersion": 1
    },
    {
      "id": "a8f2ce95-e2af-45d7-a068-870f04d09f66",
      "name": "Get Remote File Checksum",
      "type": "n8n-nodes-base.ssh",
      "position": [
        32,
        352
      ],
      "parameters": {
        "command": "sha256sum {{ $json.path }}"
      },
      "typeVersion": 1
    },
    {
      "id": "e2feef20-0895-4d3c-9dac-053766f4a298",
      "name": "Checksums Match?",
      "type": "n8n-nodes-base.if",
      "position": [
        256,
        352
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "28ac7db9-54aa-45c7-a711-df5c21e2f73f",
      "name": "End Workflow",
      "type": "n8n-nodes-base.noOp",
      "position": [
        480,
        448
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "71ef0e9f-4a7f-4c09-9511-4775df30a1cd",
      "name": "Send Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        480,
        256
      ],
      "parameters": {
        "text": "=\ud83d\udea8 *File Integrity Alert!* \ud83d\udea8\\nFile: *{{ $json.path }}* has been modified!\\nKnown Checksum: *{{ $json.knownChecksum }}*\\nCurrent Checksum: *{{ $json.stdout.split(' ')[0] }}*",
        "user": {
          "__rl": true,
          "mode": "id",
          "value": "[YOUR_SECURITY_ALERT_CHANNEL_ID]"
        },
        "select": "user",
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "47a05b08-78a3-4bfa-8a98-bff0c883b5e8",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -464,
        208
      ],
      "parameters": {
        "width": 1152,
        "height": 368,
        "content": "## Flow"
      },
      "typeVersion": 1
    },
    {
      "id": "ac402d8d-8588-4b51-a1dd-e7ea24ded695",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -464,
        608
      ],
      "parameters": {
        "color": 5,
        "width": 1152,
        "height": 352,
        "content": "# \ud83d\udea8 Automated File Integrity Check \ud83d\udee1\ufe0f\n\n* **Problem Solved:**\n    Sebagai seorang *developer AI Agent* yang fokus pada solusi untuk bisnis kecil dan menengah, Anda tahu bahwa sistem penting seperti server sering kali menjadi sasaran. Perubahan yang tidak terduga pada file-file kunci (seperti konfigurasi server atau skrip penting) dapat menjadi tanda awal dari peretasan, malware, atau aktivitas berbahaya. Mengaudit integritas file-file ini secara manual sangat tidak praktis dan tidak dapat diandalkan, terutama bagi tim IT yang kecil.\n\n* **Solution Overview:**\n    *Workflow n8n* ini menawarkan solusi sederhana namun vital untuk **pemantauan integritas file**. Otomatisasi ini secara teratur terhubung ke server remote Anda, menghitung *checksum* (misalnya, SHA256) dari file-file penting yang Anda tentukan, dan membandingkannya dengan nilai yang telah Anda konfirmasi sebelumnya. Jika ada perubahan sekecil apa pun pada file (yang ditunjukkan oleh *checksum* yang tidak cocok), tim Anda akan menerima **notifikasi instan di Slack**. Ini adalah lapisan pertahanan dasar yang efektif yang membantu mendeteksi kompromi lebih awal.\n\n* **For Whom:**\n    Otomatisasi ini sangat ideal untuk:\n    * **Tim IT dan DevOps:** Untuk memantau server produksi atau pengembangan secara otomatis.\n    * **Penyedia Layanan Managed Hosting:** Untuk menawarkan fitur keamanan tambahan kepada klien mereka.\n    * **Admin Sistem:** Untuk menghemat waktu dan memastikan integritas file-file sistem dan konfigurasi yang kritis.\n    * **Setiap Bisnis (terutama UMKM):** Yang mengelola server sendiri dan membutuhkan alat deteksi dini yang sederhana namun kuat untuk melindungi infrastruktur mereka.\n\n---\n\n### How It Works: The 5-Node Security Flow\n\nAlur kerja ini secara efisien melakukan audit integritas file yang terjadwal.\n\n1.  **Scheduled Check (Cron Node):**\n    * **Fungsi:** Ini adalah pemicu utama. Node ini menjadwalkan alur kerja untuk berjalan pada interval yang telah ditentukan, misalnya, setiap hari pada pukul 3 pagi.\n    * **Proses:** Node `Cron` secara otomatis memulai alur kerja sesuai jadwal, memastikan pemeriksaan integritas file dilakukan secara konsisten tanpa intervensi manual.\n\n2.  **List Files & Checksums (Code Node):**\n    * **Fungsi:** Node ini berfungsi sebagai database statis Anda. Di sini, Anda menentukan file mana yang ingin Anda pantau dan nilai *checksum* \"baik\" yang telah Anda verifikasi sebelumnya untuk setiap file.\n    * **Proses:** Node ini mengonfigurasi jalur file dan *checksum* yang valid ke dalam sebuah array yang akan diproses oleh node-node berikutnya. Ini memisahkan logika dari data, membuatnya mudah untuk diperbarui.\n\n3.  **Get Remote File Checksum (SSH Node):**\n    * **Fungsi:** Node ini terhubung ke server remote Anda melalui SSH untuk mendapatkan *checksum* file yang sedang dipantau.\n    * **Proses:** Node ini menjalankan perintah seperti `sha256sum /path/to/file` pada server. Hasilnya (yaitu, *checksum* saat ini) kemudian ditangkap dan diteruskan ke node berikutnya.\n\n4.  **Checksums Match? (If Node):**\n    * **Fungsi:** Node ini berfungsi sebagai logika deteksi inti. Node ini membandingkan *checksum* yang baru didapat dari server dengan *checksum* \"baik\" yang telah Anda simpan di node `Code`.\n    * **Proses:** Jika kedua nilai *checksum* **tidak sama**, itu menandakan ada perubahan pada file, dan alur kerja akan mengalihkan jalurnya ke node pemberitahuan. Jika cocok, alur kerja akan berakhir dengan aman.\n\n5.  **Send Alert (Slack Node) / End Workflow (No-Op Node):**\n    * **Fungsi:** Node-node ini adalah respons akhir dari alur kerja.\n    * **Proses:** Jika *checksum* tidak cocok, node `Slack` akan mengirimkan peringatan terperinci yang berisi informasi tentang file yang diubah, *checksum* yang diharapkan, dan *checksum* yang ditemukan. Jika *checksum* cocok, alur kerja akan berakhir tanpa notifikasi, menghemat waktu dan perhatian tim Anda.\n\n---\n\n### Cara Mengatur (Setup Steps)\n\nMenerapkan monitor keamanan penting ini di n8n sangatlah mudah.\n\n1.  **Siapkan Kredensial & Server:**\n    * **Kredensial SSH:** Siapkan **SSH credential** di n8n dengan informasi server Anda (hostname, port, user, dan kunci privat atau kata sandi). Pastikan pengguna SSH memiliki izin untuk menjalankan `sha256sum` pada file-file yang ingin Anda pantau.\n    * **Kredensial Slack:** Siapkan **Slack credential** di n8n dan catat **Channel ID** dari saluran pemberitahuan keamanan Anda (misalnya, `#security-alerts`).\n    * **Dapatkan *Checksum*:** **Ini adalah langkah paling penting.** Jalankan perintah `sha256sum [file_path]` secara manual di server Anda untuk setiap file yang ingin Anda pantau. Salin dan simpan nilai *checksum* yang dihasilkan\u2014ini adalah *checksum* \"baik\" yang akan Anda gunakan sebagai referensi.\n\n2.  **Impor Alur Kerja JSON:**\n    * **Impor:** Di n8n, buat alur kerja baru dan pilih \"Import from JSON.\" Tempelkan kode JSON yang disediakan di respons sebelumnya.\n\n3.  **Konfigurasi Node:**\n    * **Scheduled Check (Cron):** Atur jadwal sesuai preferensi Anda (misalnya, setiap hari pukul 03:00 pagi).\n    * **List Files & Checksums (Code):** Buka node ini dan **edit array `filesToCheck`**. Masukkan jalur file server Anda yang sebenarnya dan tempelkan *checksum* \"baik\" yang Anda dapatkan secara manual di langkah 1.\n    * **Get Remote File Checksum (SSH):** Pilih **SSH credential** Anda.\n    * **Send Alert (Slack):** Pilih **Slack credential** Anda. Ganti `YOUR_SECURITY_ALERT_CHANNEL_ID` dengan **Channel ID** Anda yang sebenarnya.\n\n4.  **Uji & Aktifkan:**\n    * **Uji Manual:** Jalankan alur kerja secara manual. Verifikasi bahwa alur kerja berhasil terhubung ke server dan memeriksa file tanpa mengirimkan peringatan (asumsi file tidak berubah).\n    * **Verifikasi:** Jika Anda ingin menguji peringatan, ubah salah satu file di server secara manual dan jalankan lagi. Periksa saluran Slack Anda untuk memastikan peringatan dikirimkan dengan benar.\n    * **Aktifkan:** Setelah Anda yakin semuanya berfungsi, aktifkan alur kerja. Sekarang, n8n akan secara otomatis mengaudit integritas file-file penting Anda sesuai jadwal.\n\n---"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "4489311f-ff4b-4df7-8ac6-f378f84c5361",
  "connections": {
    "Scheduled Check": {
      "main": [
        [
          {
            "node": "List Files & Checksums",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Checksums Match?": {
      "main": [
        [
          {
            "node": "Send Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "End Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List Files & Checksums": {
      "main": [
        [
          {
            "node": "Get Remote File Checksum",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Remote File Checksum": {
      "main": [
        [
          {
            "node": "Checksums Match?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}