LINUX.ORG.RU
ФорумAdmin

Написание Bash скрипта. (Задача)

 ,


0

1

Добрый вечер. Столкнулся с такой задачей. Сначала вроде показалась простой а потом вдруг нереально сложной. ;-)

Условие следующее: Есть сервер, на нем сайт с открытым 80-м портом. И есть 22 ssh открыт для избранных айпи.

Внезапно понадобилось с публичного места срочно зайти по SSH.На такой случай есть скрипт который раз в минуту парсит лог nginx и смотрит урл. например ты набираешь секретный урл anakonda.ru. Если же просто зайти выдаст 404 ошибку.

Твой скрипт каждую минуту ищет контрольное слово SSHenable - если он его находит в логе, то берет айпи с этой же строки и добавляет в Iptables в разрешенную таблицу к ssh.

Задача! Можно ли этот скрипт уместить в 9 строк?

лучше настроить какое-нибудь port knocking

linxon
()

Можно даже в одну строку уместить. Но для этого нужно написать в job и назначить цену.

Jameson ★★★★★
()

Можно даже в одну строку уместить. Как выше сказано

Двоеточиее...

Зачем Нам ваше домашку тут выполнять?

Bootmen ☆☆☆
()
Последнее исправление: Bootmen (всего исправлений: 1)

На отдельном порту ssh по ключам или паролю с f2a

про port knocking уже сказали.

vel ★★★★★
()

Port knocking - проверенное решение.

Kroz ★★★★★
()

По твоему описанию вспомнился fail2ban, только правила и действия обратные. Да, есть такое, называют pass2allow.

boowai ★★★★
()
Последнее исправление: boowai (всего исправлений: 5)

Можно ли этот скрипт уместить в 9 строк?

Ты условия не задал. Тут, например, кроме привычных sed и file, которые тоже могут запретить, используется nc: HTTP сервер на bash одной строкой

boowai ★★★★
()
Последнее исправление: boowai (всего исправлений: 1)

А попробуйте такой скриптик

package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"os/exec"
	"strings"
	"time"
)

func execCommand(ip, mode string) {
	cmd := exec.Command("iptables", mode, "INPUT", "-s", ip, "-j", "ACCEPT")
	cmd.Run()
	if err := cmd.Run(); err != nil {
		log.Fatal(err)
	}
}

func handler(w http.ResponseWriter, r *http.Request) {
	remoteIP := strings.Split(r.RemoteAddr, ":")[0]
	fmt.Fprintf(w, "Hi there %s!", remoteIP)
	go func() {
		log.Printf("Open iptables rule for %s\n", remoteIP)
		execCommand(remoteIP, "-A")
		time.Sleep(60 * time.Second)
		log.Printf("Close iptales rule for %s\n", remoteIP)
		execCommand(remoteIP, "-D")
	}()
}

func main() {
	myPort := os.Args[1]
	myUrl := os.Args[2]
	http.HandleFunc(myUrl, handler)
	log.Fatal(http.ListenAndServe(":"+myPort, nil))
}

Запускать с аргументами где первый аргумент это порт а второй аргумент url

go run ./main.go 8080 /url

Т.е. при обращении curl 127.0.0.1:8080/url должно создаваться правило, но не нашел под рукой линуксового сервера - проверить не могу

Тапками не кидайтесь, очень интересно было попробовать такое сделать на go

anonymous
()
Ответ на: комментарий от anonymous

А где тут go? Все через os.exec сделано.

Я так парсер на пайтоне писал когда-то, просто grep запускал через subprocess :)

PunkoIvan ★★★★
()

Правильно пишут про port knocking, но есть другой несложный вариант - поднять onion service v3 и не давать никому адрес, самому пробросить на нём порт 22.

Можно при необходимости ещё и настроить авторизацию непосредственно для соединения с onion service. В сумме это две строчки в torrc, один авторизационный файл с ключом x25519 на сервере и один на клиенте.

Как бонус из коробки получишь очень защищённое и почти неуязвимое для прослушки соединение, а вкупе со встроенной в SSH совершенной прямой секретностью получишь защиту, схожую с OTR.

Хороший вариант для камер и систем безопасности, сам так делаю, не лень будет развёрнуто всё тебе подсказать.

SM5T001
()
Ответ на: комментарий от SM5T001

И плюс приватный мост. В этой стране последний год уже плоховато работает, а в последние дни по ночам у меня даже не может цепочку проложить, или даже не бутстрапится.

boowai ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.