🐧 Как ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ JSON Π² CSV с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ шСлла Linux / Unix

БСгодня я расскаТу ΠΎ распространСнной ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ систСмныС администраторы ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Linux ΠΈΠ»ΠΈ Unix.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, соврСмСнныС прилоТСния ΠΈ устройства бСзопасности сильно зависят ΠΎΡ‚ API ΠΈ списков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON.

НапримСр, список спамботов ΠΈΠ»ΠΈ VPN CIDR ΠΈΠ»ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ список ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… IP CIDR Π±ΠΎΡ‚ΠΎΠ² – Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON.

Если устройство ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ JSON, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π·ΡΡ‚ΡŒ этот список ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² свой ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ WAF.

К соТалСнию, Π½Π΅ всС устройства ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ JSON.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π·ΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ JSON ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ CSV Π² соотвСтствии с нашими потрСбностями.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ JSON ΠΈ CSV?

JSON – это сокращСниС ΠΎΡ‚ JavaScript Object Notation.

Часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π²Π΅Π±-прилоТСниях, Π½ΠΎ Π½Π΅ ограничиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ JavaScript.

МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой язык программирования, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Perl, Python ΠΈΠ»ΠΈ инструмСнты CLI, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ jq.

CSV – это Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΎΡ‚ Comma-separated values. Π­Ρ‚ΠΎ тСкстовый Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² элСктронных Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…, языках программирования ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… прилоТСниях.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° JSON

Π—Π΄Π΅ΡΡŒ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ df Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON:

[ { «fs»: «/dev/mapper/vgubuntu-root», «type»: «ext4», «size»: «915G», «used»: «135G», «avail»: «734G», «usedpercentage»: «16%», «mounted»: «/» }, { «fs»: «/dev/nvme0n1p2», «type»: «ext4», «size»: «1.4G», «used»: «378M», «avail»: «939M», «usedpercentage»: «29%», «mounted»: «/boot» }, { «fs»: «/dev/nvme0n1p1», «type»: «vfat», «size»: «511M», «used»: «30M», «avail»: «482M», «usedpercentage»: «6%», «mounted»: «/boot/efi» }]

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° CSV

JSON выводится Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ CSV (всС значСния Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ запятой , Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅):

/dev/mapper/vgubuntu-root,ext4,915G,135G,734G,16%,//dev/nvme0n1p2,ext4,1.4G,378M,939M,29%,/boot/dev/nvme0n1p1,vfat,511M,30M,482M,6%,/boot/efi

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ JSON Π² CSV с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Linux / Unix
Как ΠΆΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π²Π²ΠΎΠ΄? ΠžΡ‚Π²Π΅Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² использовании ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки jq ΠΈΠ»ΠΈ dasel.

Установка jq

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ jq доступСн Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ распространСнных Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π², я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ jq Π½Π° Debian ΠΈΠ»ΠΈ Ubuntu Linux с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ apt command/apt-get:

sudo apt install jq

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ RHEL/Fedora/CentOS/Alma/Rocky Linux ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ dnf:

sudo dnf install jq

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Alpine Linux ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ apk:

sudo apk add jq

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ SUSE ΠΈΠ»ΠΈ OpenSUSE Linux ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ zypper:

sudo zypper in jq

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ macOS / OS X установитС homebrew, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ brew:

brew install jq

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ – ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ JSON Π² CSV ΠΏΠΎΠ΄ Linux

Бинтаксис Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ для df.json:

cat df.json | jq

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ΠΌ ΠΏΠΎΠ»Π΅ fs, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ:

cat df.json | jq ‘.[] | .fs’

Как насчСт ΠΏΠΎΠ»Π΅ΠΉ fs ΠΈ type?

cat df.json | jq ‘.[] | .fs, .type’

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ CSV-Ρ„Π°ΠΉΠ» с запятой Π² качСствС раздСлитСля, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:

cat df.json | jq ‘.[]| join(«,»)‘

join(β€œ,”) ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ массив элСмСнтов, Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ , Π² качСствС раздСлитСля:

Как ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» JSON Π² CSV?

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ», ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ bat/cat

«/dev/mapper/vgubuntu-root,ext4,915G,135G,734G,16%,/»»/dev/nvme0n1p2,ext4,1.4G,378M,939M,29%,/boot»»/dev/nvme0n1p1,vfat,511M,30M,482M,6%,/boot/efi»

ΠŸΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -r raw, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ:

cat df.json | jq -r ‘.[]| join(«,»)‘

Как ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» JSON Π² CSV?

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ», ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ bat/cat:

cat bingbot.json$ batcat bingbot.json

ΠžΠ±Ρ€Π°Π·Π΅Ρ† ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

{ «creationTime»: «2021-11-10T10:00:00.121331», «prefixes»: [ {«ipv4Prefix»: «157.55.39.0/24»}, {«ipv4Prefix»: «207.46.13.0/24»}, {«ipv4Prefix»: «40.77.167.0/24»}, {«ipv4Prefix»: «13.66.139.0/24»}, {«ipv4Prefix»: «13.66.144.0/24»}, {«ipv4Prefix»: «52.167.144.0/24»}, {«ipv4Prefix»: «13.67.10.16/28»}, {«ipv4Prefix»: «13.69.66.240/28»}, {«ipv4Prefix»: «13.71.172.224/28»}, {«ipv4Prefix»: «139.217.52.0/28»}, {«ipv4Prefix»: «191.233.204.224/28»}, {«ipv4Prefix»: «20.36.108.32/28»}, {«ipv4Prefix»: «20.43.120.16/28»}, {«ipv4Prefix»: «40.79.131.208/28»}, {«ipv4Prefix»: «40.79.186.176/28»}, {«ipv4Prefix»: «52.231.148.0/28»}, {«ipv4Prefix»: «51.8.235.176/28»}, {«ipv4Prefix»: «51.105.67.0/28»} ]}

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ†Π΅Π»ΡŒΡŽ являСтся созданиС Ρ„Π°ΠΉΠ»Π° .CSV ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π°: для WAF:

157.55.39.0/24,BingBot207.46.13.0/24,BingBot40.77.167.0/24,BingBot13.66.139.0/24,BingBot13.66.144.0/24,BingBot52.167.144.0/24,BingBot13.67.10.16/28,BingBot13.69.66.240/28,BingBot13.71.172.224/28,BingBot139.217.52.0/28,BingBot191.233.204.224/28,BingBot20.36.108.32/28,BingBot20.43.120.16/28,BingBot40.79.131.208/28,BingBot40.79.186.176/28,BingBot52.231.148.0/28,BingBot51.8.235.176/28,BingBot51.105.67.0/28,BingBot

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹

Для получСния прСфиксов CIDR сначала Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

cat bingbot.json | jq ‘.prefixes[]’

Π—Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ JSON для добавлСния поля коммСнтария:

cat bingbot.json | jq -r ‘.prefixes[] | {cidr: .ipv4Prefix, comment: «BingBot»}’

НаконСц, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ join() для создания Ρ„Π°ΠΉΠ»Π° .CSV:

cat bingbot.json | jq -r ‘.prefixes[] | {cidr: .ipv4Prefix, comment:
«BingBot»} | join(«,»)’

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ:

cat bingbot.json | jq -r ‘.prefixes[] | {cidr: .ipv4Prefix, comment: «BingBot»} | join(«,»)’ > bingbot.csv

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅:

cat bingbot.csv

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ я ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π» Ρ„Π°ΠΉΠ» CIDR Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ .CSV.

ПослС прСобразования я Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽ Ρ„Π°ΠΉΠ» .CSV Π² WAF.

Π­Ρ‚ΠΎΡ‚ процСсс Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сцСнария ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ΠΈ API для Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎΠ³ΠΎ обновлСния списка, Ρ‡Ρ‚ΠΎΠ±Ρ‹ WAF пропускал Π±ΠΎΡ‚ΠΎΠ² MS bing, Π½Π΅ блокируя ΠΈΡ….

Π― использовал jq вмСсто dasel, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π·Π½Π°ΠΊΠΎΠΌ с синтаксисом jq, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ dasel.

Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ страницу руководства ΠΏΠΎ jq с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ man ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ help:

man jq

Π”Ρ€ΡƒΠ·ΡŒΡ ΠΏΠΎΠΌΠΎΠ³ΠΈΡ‚Π΅ этому ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Ρƒ ΡΡ‚Π°Ρ‚ΡŒ доступнСС Π² ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях.

НС ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈ ΠΌΠΈΠΌΠΎ ΠΆΠΌΠ°ΠΊΠ½ΠΈ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΡƒ Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π΅Π½!

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *