Продвинутые подходы поддержания ИБ: DSL, Metaprogramming etc


Тред отделён как сборник неконструктивных, неконкретных и общих коментов от документа Policy-based-фильтрация с помощью iptables[link1].

Предлагается обсуждать избыточность/приемлемость каких-либо концептуально сложных системных подходов для поддержания ИБ. Не только на примере iptables, но и для управления/конфигурирования всего остального.



Комментарии
— unknown (17/02/2015 10:14, исправлен 17/02/2015 11:40)   

К сожалению, никакой конструктивной критики предложить не могу. Могу только описывать с печальными примерами из своего и окружающего опыта, почему данное ненужно действительно не нужно.


  1. Для тех, кто знает iptables ещё со времён ipchains, никакие надстройки над ним не нужны. Лучше однообразный и примитивный скрипт с кучей повторений, чем этот ужасный самопально-велосипедный синтаксический сахар. Возьмите у любого админа настройки чего-то сложного на сети из тысяч компов. Там обычное перечисление правил с коментами. И всё понятно любому его коллеге. За свой метаязык админа поубивали бы. Т.е. длинными списками iptables вполне можно обойтись.
  2. Самопальный метаязык над iptables не нужен. Лучше мучаться до тех пор, пока в iptables не поменяют синтаксис или не прикрутят к нему штатный метаязык из коробки, но лишь бы не самопал. Например, над TeX есть стандартный штатный метаязык LaTeX. LaTeX — нужен. А над LaTeX некоторые пытались внедрить LyX. LyX — не нужен. Если при первом взгляде на LyX человек этого не понимает, то объяснять бесполезно. Пусть пройдёт через все шишки сам: одним набором через графинтерфейс не отделаться, нужно изучать вставки LyX, под ним лезть вставками в LaTeX, пока не закончится тем, что проще выучить LaTeX и всё.
  3. Метаязыки и метасинтаксис на шелле особенно не нужны. Он не для этого.
  4. Выжимать из шелла что-то слишком сложное не нужно. Это может дойти до того, что в нём пытаются городить хитрые парсеры, сложные функции, эмулированные объекты, подгружаемые библиотеки, а в итоге переходят на питон, перл, руби или что-то подобное, в чём можно поддерживать большой сложный проект. Шелл — для простого, метаязык и велосипедный синтаксис на нём сложно поддерживать, как и любые большие сложные проекты. После очередного обновления системы вам придётся перепроверять все скрипты, параметры и пр., что было проще сделать в «тупом» скрипте без хитрой логики внутри. Любой sed, awk, grep и пр. вас могут подставить, хуже того, если это будет незаметно. Шелл — это простой склеиватель утилит, не надо из него пытаться сделать полноценный скриптовый язык программирования.

Т.е. иногда более высокие абстракции и автоматизация — полезны. Но в случаях, подобных вашему, на поддержание «упрощающего» синтаксиса в перспективе будет потрачено больше усилий, чем на использование стандартного. Это как эмуляция экскаватора с помощью лопаты, колеса, верёвки и прочих подручных средств: и котлован не выроете, и нормальный экскаватор не создадите. Только время потратите впустую.



Смиритесь с этим. Или напишите полную альтернативу iptables на уровне утилиты и ядра. Только не скриптовые костыли.



Сколько пришлось видеть такого пионерства, которое себя не оправдало, даже сам когда-то таким страдал :)



Тоже симптоматично. С какого-то предела, проще выучить чуть более длинные команды, чем поддерживать массу самопальных алиасов.



Жесть какая. Если бы я перешёл на систему с pf, то выучил бы именно его синтаксис, а не писал бы метаязык для работы с ним (да ещё и на шелле!), эмулирующий более привычный мне iptables. Это всё равно, что к офисному пакету придумывать эмулятор LaTeX и наоборот. Выучите оба, если нужно, но не скрещивайте в самопального монстра.


Хотя, возможно, хорошо, что вы со своей упоротостью только скриптоманией страдаете, но не пишите коммиты в утилиты и в ядро, а то вот узнает Леннарт Поттеринг про ваши идеи и запихает iptables в systemd. Тогда всё, приехали. Судя по описанию поставленных целей, начальная стадия синдрома Поттеринга у вас уже заметна. Хотя это не буквально всё про вас. Просто приходилось сталкиваться с такими улучшателями, которые вредные улучшения красочно и якобы убедительно расписывают как полезные и с большим энтузиазмом пропихивают.

Гость (17/02/2015 13:13)   

Как вы можете догадаться, скрипт я писал самостоятельно. Прежде, чем его писать, мне пришлось ознакомиться с iptables хотя бы на уровне самого базового функционала.


Загрузите правила, выполните iptables-save и получите свои любимые длинные списки, если они действительно нужны. Скрипт ужасен, но я сразу сказал, что он для бедных. У меня нет ни нужной квалификации, ни желания делать полноценный DSL. Но если скрипт упрощает работу хотя бы мне, он полезен.


Такое впечатление, что здесь открылся филиал ЛОРа. Unknown, вы с программированием когда-то были связаны? У вас есть базовые знания хотя бы? Я имею в виду не тяжёлое советкое ассемблерное низкоуровневое наследие с нулевой культурой в IT и CS, а настоящее программирование — то, чему учат в MIT? Вы создавали когда-нибудь свой ЯП? Вы писали на LISPе? Вы понимаете, что такое программирование в самом общем виде, как закладывается синтаксис и семанитика в том или ином языке, зачем? Вы слышали фразу, что любой сложный проект наполовину состоит из своего собственного костыльного и кривого интерпретатора LISPа? Если у нас нет общей базы, о чём мы могли бы с вами поговорить, то можно только покидаться говном. Вы мне напишете, что ненужно, а я вам скажу идти в детский сад, подучить матчасть. Для начала хотя бы осознайте классическую критику принципа worse is better, и почему этот растиражированный всюду в оупенсорсе принцип уё*щен. Это умные люди с именем писали, ознакомьтесь.

Одно из следствий WiB в UNIX выржается в том, что раз мы делаем программы настолько простыми, насколько это можно, вся сложность перекладывается с компьютера на человека. Вместо того, чтобы поручить все низкоуровневые вещи компьтеру, вы сами становитесь компьютером и выполняете за него его работу. Специалисты вообще мыслят в категории DSL. Они не пользуются ЯП в классическом понимании этого слова. Вам нужно решить конкретную задачу? ОК, быстренько набросаем синтаксис, какой нам удобен и уместен под неё, получим свой in sutu ЯП под задачу — domain specific language (DSL), потом на нём красиво и изящно всё напишем. Получается концептуально и просто. Но для того, чтоб так уметь, нужно знать программирование, и знать не в смысле синтаксиса конкретного ЯП, а в самом общем, что реализует собой LISP. Я тоже это всё не знаю, но у меня хотя бы есть общее понимание проблемы, сложившееся от общения с компетентными людьми.


Мне нужно решение сейчас, а не через 20 лет. В самопале нет ничего плохого, если отстутствует достойная альтернатива.


Аналогия вообще не тему. LyX — это не метаязык поверх LaTeX, а визуальный редактор для него. Правильной аналогией было бы «нафиг нам стилевые файлы в LaTeX, пишите для каждой pdf'ки всё in situ, со всеми кишками!». Стилевой файл — это, знаете ли, функции и скриптинг. Считайте, что я тоже написал свой консольный стилевик для iptables.


Ещё раз: у меня нет проблем со знанием iptables. :-) Вот если бы кто-то пытался взять мой скрипт и использовать его без понимания iptables, можно было бы говорить.


С этим согласен, но в моём случае речь шла о том, чтобы либо сделать быстро хоть что-то и на чём-то, либо не сделать вообще ничего. До этого я годами использовал iptables-кишки, как и все остальные.


Я полностью согласен. Но даже если б я знал условный python, всё равно, не было планов писать полноценный серьёзный интерпретатор. Более того, насколько я слышал, были разные попытки написать конвертор правил из iptables в pf и обратно, но я специально их не искал — я не хочу полагаться на чужой и возможно костыльный проект, а в своём я досконально знаю кажду функцию, что она делает.


Их синтаксис, как и синтаксис iptables, не меняется десятилетиями годами ни на йоту, а базовые регекспы, которыми я воспользовался, не меняются со времён 70-ых. У меня есть старая книжка по очень дервнему коммерческому UNIX'у (тогда ещё даже персоналок не было), так вот, там всё точь-в-точь так же.


Нет. Я в какой-то момент, может, с год назад, написал этот скрипт, после этого он практически не менялся. После того я успел много раз порадоваться тому, что не надо каждый раз лазить по сотням строк и искать, что там закомментировать, а что раскомментировать, чтобы включить/отключить нужное. Теперь всё легко и понятно, находится в одном месте. Одну строчку раскомментировал — опция заработала, одну закомментировал — отключил.


С чего это я должен смиряться, если есть способ упростить жизнь?


Соломоново решение «всё или ничего» не всегда мудро.


Я не знаю ситуаций, о которых вы говорите, чтобы комментировать по существу. У меня есть только свой личный опыт.


Дело не в знании команд, а в естественности! Почему я должен писать длинные команды по 100 раз, когда можно сократить? Алиасы за тем и были придуманы. Может быть, вы против вообще всех алиасов на шелле и скриптинга? Ваши аргументы к этому случаю тоже применимы: не пишите функции, не создавайте алиасы, каждый раз вбивайте в командной строке всё, что вам нужно с нуля, т.к. «проще выучить язык, чем городить самопальные функции» — так что ли?


Повторяю ещё раз, жирным: я знаю синтаксис iptables, иначе этот конвертор я не смог бы написать. А писал я конвертор не потому, что у меня с синтаксисом туго, а потому, что мне нужен не какой-нибудь ассмеблерный конечный автомат, а вменяемый policy based файерволл! Это вообще не о синтаксисе (если вы способны понять, о чём я пишу). Синтаксис можно было бы написать другой, просто взял тот, к какому уже привык. «Policy based» означает, что я задаю и мыслю, программируя, в рамках политик, а не правил. Чувствуете отличие? Это разговор с файерволллом на человеческом языке, а не на языке асма. Я ему объясняю, что должно быть разрешено, а что запрещено (как и в pf), а не описываю, как это сделать с помощью конкретных правил. Конкретные правила пусть за меня компьютер додумывает, а я займусь чем-нибудь более полезным.


Нет, вы меня совершенно неправильно поняли. Я написал свой костыльный самопал под свой очень и очень узкий круг задач. Это хорошо может помочь на десктопе параноика, но почти наверняка будет бесполезным в каком-нибудь продакшн, где совсем другие задачи и другой набор типичных правил iptables.

Откуда это всё берётся — понять просто. Когда вы реализуете конкретно свою задачу на iptables, выясняется, что вам нужен 1% от его возможностей. Поэтому разумно этот 1% отразить и в синтаксисе — сделать практичнее, жертвуя универсальностью. Потом, если вы видите, что одно и то же требуется написать 5 раз подряд с чуть другими портами, вам любой программист скажет: пишите функцию.

Чтобы вам было понятнее, убрал все алиасы:
allow_out(){
    # This function allows outgoing traffic and the corresponding replies
    # The network myIP/24 is blocked
    local intf=$1
    local our_proto=$2
    local srcIP=$3    # local IP
    local dstIP=$4    # remote IP
    local dstPORT=$5    # remote port
    local our_user=$6
    if [ $dstIP = all ]; then
        if [ $our_proto = tcp ]; then
            iptables  -A OUTPUT -j ACCEPT -o $intf -p tcp -s $srcIP \
                ! -d $srcIP/24 -m tcp --dport $dstPORT -m owner \
                --uid-owner $our_user
            iptables  -A INPUT  -j ACCEPT -i $intf -p tcp ! -s $srcIP/24 \
                -m tcp --sport $dstPORT -d $srcIP -m state --state ESTABLISHED
        elif [ $our_proto = udp ]; then
            iptables  -A OUTPUT -j ACCEPT -o $intf -p udp -s $srcIP \
                ! -d $srcIP/24 -m udp --dport $dstPORT -m owner \
                --uid-owner $our_user
            iptables  -A INPUT  -j ACCEPT -i $intf -p udp ! -s $srcIP/24 \
                -m udp --sport $dstPORT -d $srcIP -m state --state ESTABLISHED
        fi
    else
        if [ $our_proto = tcp ]; then
            iptables  -A OUTPUT -j ACCEPT -o $intf -p tcp -s $srcIP \
                -d $dstIP -m tcp --dport $dstPORT -m owner \
                --uid-owner $our_user
            iptables  -A INPUT  -j ACCEPT -i $intf -p tcp -s $dstIP \
                -m tcp --sport $dstPORT -d $srcIP -m state --state ESTABLISHED
        elif [ $our_proto = udp ]; then
            iptables  -A OUTPUT -j ACCEPT -o $intf -p udp -s $srcIP \
                -d $dstIP -m udp --dport $dstPORT -m owner \
                --uid-owner $our_user
            iptables  -A INPUT  -j ACCEPT -i $intf -p udp -s $dstIP \
                -m udp --sport $dstPORT -d $srcIP -m state --state ESTABLISHED
        fi
    fi
}
Теперь, чтобы разрешить юзеру user коннектиться к privoxy добавляем политику
allow_out lo tcp 127.0.0.1 127.0.0.1 8118 user
Чтобы разрешить коннектиться к Tor'у:
allow_out lo tcp 127.0.0.1 127.0.0.1 9050 user
Чтобы к mpd:
allow_out lo tcp 127.0.0.1 127.0.0.1 6600 user
Плохо получилось, да? В этих трёх строках ошибку сделать при копипасте, конечно же, проще, чем в вышеприведённых кишках в функции. Почитайте старые обсуждения[link3].

Я пока те правила писал, всю голову себе сломал. Мне это очень напомнило свой первый опыт с ipfw лет 10 назад: на низком уровне надо воспроизвести у себя в голове, как пакет проходит от одного юзера к другому и возвращается обратно, как у него меняются параметры in на out, порты исходящие и назначения, юзер и т.д. Нужно нигде не ошибиться. Даже воспроизведя всю логику правильно и написав эти правила, когда их пишешь другой раз, всё равно ошибаешься, потому что слишком много всего низкоуровневого и нечеловеческого. Мне сейчас предельно понятно, что всё вот это низкоуровневое было запихнуто умными людьми в keep state, а в вашей голове, из-за вашей ограниченности в знаниях файерволлов, вы даже не знаете, что же такое keep state. keep state — это не m state --state ESTABLISHED, понимаете? Это автоматическое приплюсвывание к нужному правилу остальных, которые будут разрешать путь для ответных пакетов. И вам не нужно думать об этом самому. Сейчас keep state вообще в pf по умолчанию. Если вам не нравится, можно его отключить через дописывание к правилу no keep state, вот только много ли оно кому надо? Вам часто нужно посылать что-то демону и никогда не получать ответов обратно? Если вы хотите писать на pf, как на iptables, это можно, я уверяю, но никто так не делает.

Я скажу даже больше: когда я копировал $pass_out-правила я однажды ошибся, написал в одном случае вместо исходящего порта порт назначения, и эта ошибка была выловлена только при дебаге — визуально просматривая файл я так и не смог её найти. В общем, я за то, чтобы способов нечайно выстрелить себе в ногу было как можно меньше, а не за то, что «кто пишет упрощающие инструменты, тот не осилил». В данном случае даже если осилили, рано или поздно ошибки будут. Всю индустрию оупенсорца за это тоже многократно ругали: многие ошибки возникают из-за того, что пишут на сях, а там за всем не уследишь, рано или поздно человек ошибатеся. Не зря же умные люди пишут кодогенераторы C-кода на чём-то высокоуровневом и удобном.

Мне это напоминило один старый разговор с умным человеком:

— Это надо объяснять?
— Нет.
— Хорошо. ☺
— ?
— Хе-хе. Как говорится, если это надо объяснять то это не надо объяснять.
— А, это да, согласен.

Это глубокая формула, в которую укладывается множество всего. Если выясняется, что собеседник не понимает чего-то совсем концептуального, и ему надо объяснять, то можно извести тонны бумаги и написать сотню простыней, но это всё равно окажется «не в коня корм», потому что это требует некого переосмысления, взятия барьера абстракций и т.д. Короче, процесс сложный, небыстрый и часто очень неблагодарный, поэтому лучше с ним не связываться, и просто ничего не объяснять, оставив своё мнение при себе. Вот и получается, что «если не надо объяснять, то ОК, не обсуждаем, и так друг друга понимаем, а если надо объяснять, то это [всё равно] не надо объяснять, потому что бесполезно».

Дискуссия сильно напомнила этот коммент[link4]. Ну вот я выложился, внимательно прочитал всё и всё по полочкам разложил, где, кто, в какой степени и почему заблуждается. И что, это вас убедило? Да ни разу. Вы как считали, что Арно всё делает правильно, так и до сих пор[link5] считаете. Все аргументы ушли впустую, время потрачено зря. Интересно, что даже возражений по сути не было, а всё равно, «раз Арно считает, им там видней». Вот поэтому, если на начальных порах чувствуется, что с собеседником мало общего в понимании, дальше обсуждать смысла нет. С одной стороны, это чревато, конечно, тем, что можно оказаться реально неправым и уйти в отрыв, но, с другой стороны, можно не тратить своё время попусту. Вспоминается перепост[link6]:

Меньше времени тратить на женщин и людей глупее себя.

Мой вам совет: хотите расширить сознание — изучите что-нибудь полезное. Пусть хотя бы тот же LISP, Haskell или PF. Это позволит взглянуть на одни и те же вещи совсем по другому, даст возможность сравнивать. Пока вы ничего не видели окромя iptables, и вам не с чем его сравнить, вы так и будете до конца жизни убеждённым, что другого пути нет, и быть не может.

P.S. В соответствующих узких кругах вопрос скриптинга iptables обсуждался, никто ничего не сказал против, хотя все люди были неглупыми (во всяком случае, Linux, iptables и программирование они знают намного лучше меня). Так и сказали: да, каждый городит свои костыли в меру испорченности, ничего единого более высокоуровневого нет. Тот, кто умнее, не трахает мозг, а на машины с файерволлами ставит BSD и юзает PF. В общем-то, оно и неудивительно. Когда у меня конфиг PF'а с кучей нетривиальных правил был десятка два строк, а на iptables я понял, что чтобы написать аналогичное, мне нужно не два десятка, а две сотни строк (а потом эту кашу-малу ещё и поддерживать как-то надо!), то сразу стало понятно, что так жить нельзя.
Гость (17/02/2015 13:30)   
Был бы ещё желательным функционал удаления конкретных правил на лету и их возвращения обратно. Каждый раз комментить и декомментить конкретные строки не только неудобно, но и небезопасно: в один момент (при перезагрузке правил) все правила iptables сбрасываются, поэтому потенциальные зловреды могут прорваться наружу.
— unknown (17/02/2015 13:54, исправлен 17/02/2015 14:24)   

Так. Это я говорю, после того как эти функции писал (и даже сам предлагал ровно с той же логикой, что и вы) и частично поддерживал скриптовые проекты на десятки тысяч строк кода.



Я знаю когда их изобрели, знаю, что консоль — это телетайп с перфолентами, знаю, что dd — это диск-дупликатор, tar — это tape archiver и т.д. И сколько лет этому всему, и что оно стабильно и якобы не меняется, что на бумаге и в книгах это так. А на практике — нет. У меня реально разваливались скрипты из-за этого.



Вы меня совсем за непонимающего идиота держите. Естественно, вы его понимаете, иначе не написали бы скрипт, но iptables вам не нравится на уровне подхода. Так вот, я бы выучил на уровне не просто понимания, а принятия подхода (пусть и плюясь от необходимости его использования). Или бы коммитил в проект. Но костыли для самопального перевода одной системы понятий в другую — не нужны. Их поддержка отнимает массу времени.


Ну как ещё вам объяснить. У меня была куча скриптов для GnuPG, с кучей общих функций, псевдобиблиотек, менюшек, проверяльщиков ошибок и пр. — типа пусть машина всё делает за меня, особенно сложные операции. Оказалось проще выучить GnuPG, вместо скриптов и алиасов оставить подсказки для наиболее часто используемых команд (персональный tipsheet, из которого копировать в строку нужные куски). Но обязательно находится кто-то, кто снова хочет начать с такого костылестроения. И красивый подход применить, и свой ЯП запилить и пр.



На десятки и десятки тысяч строк используется. Для тысяч хостов пишут одно и то же правило копированием строчки, даже не циклом (а вам в одно локалхосте не разобраться). Зато напротив каждой строчки стоит свой комент. Всё это элементарно редактируется через vim по ssh. И если для какой-то машины нужно вкорячить нестандартное правило, то не надо в спешке програмить скрипт и отлаживать.


Напишите плагины для Shorewall в целях локального использования. Не, ну если хотите, то делайте для себя, что угодно. Я такое делал и для себя, и практически в продакшн и нервы себе уже попортил спорами на эту тему, больше не хочу, спасибо.


Это глубокая формула, в которую укладывается множество всего. Если выясняется, что собеседник не понимает чего-то совсем концептуального, и ему надо объяснять, то можно извести тонны бумаги и написать сотню простыней, но это всё равно окажется «не в коня корм», потому что это требует некого переосмысления, взятия барьера абстракций и т.д. Короче, процесс сложный, небыстрый и часто очень неблагодарный, поэтому лучше с ним не связываться, и просто ничего не объяснять, оставив своё мнение при себе. Вот и получается, что «если не надо объяснять, то ОК, не обсуждаем, и так друг друга понимаем, а если надо объяснять, то это [всё равно] не надо объяснять, потому что бесполезно».

Вот! Я многие темы, поднимаемые на форуме, не обсуждаю или сворачиваю с обсуждения, когда понимаю, что куча времени — впустую. Иногда сразу понятно, что обойти стороной, иногда с какого-то момента. Не в смысле даже, что я прав, а кто-то неправ, просто — не моё, неинтересно, дальше без меня.


У меня тоже есть куча своих программных костылей, которые я бы никому не предложил и не вынес в паблик. Т.к. это изврат, составленный под свои узкие личные предпочтения, не более. А в целом он не нужен. Как в своё время делал проверяльщик подписей для apt, когда подписи пакетов были, а штатной их поддержки в самом apt — не было. Оно даже работало и даже правильно. Так же как и аналог LUKS, до появления собственно LUKS и ещё кучу всякого бреда. Но поддерживать этот изврат самому для себя — сомнительное удовольствие. Хорошо, что сейчас это есть штатно. Даже этот[link7] изврат я готов бросить моментально по двум противоположным причинам: сделают штатное решение лучше моего или наоборот — сделают так, что поддерживать это всё будет слишком сложно и проще сидеть вообще без тора.

Гость (17/02/2015 16:23)   

Т.е. вы вбивали десятки тысяч строк в командной строке каждый раз с нуля, когда вам это было нужно? :) Если нет, то зачем это приводить в пример?


Чем сложнее скрипт, тем выше вероятность. У меня тоже бывало, что что-то отваливалось в скриптах, но не из-за апгрейда, а из-за переноса, например, с BSD на Linux или наоборот, но это неудивительно, т.к. базовые утилиты там разные по опциям, хоть и очень похожи. Если отвалится, буду фиксить. Проблемы надо решать по мере их поступления.


Вы пытаетесь писать иносказательно, думая, что собеседник до всего сам догадается.


Да.


А нет там никакого «подхода» окромя «мы написали так, как было проще программистам, а не юзерам, теперь пусть юзеры выкручиваются, как хотят; раз iptables тьюрингполон в плане возможностей, потенциально на нём всё можно написать». Ну придёт к вам человек сейчас и скажет, что браузер надо писать на ассемблере, типа «подход» у него такой; как писать — он сам не знает, но знает что 1) это возможно 2) асм работает, как заявлено в спеках 3) асм тьюринг-полон, поэтому гипотетически на нём можно написать всё, что угодно. И что вы ему на это ответите?


В вашем случае вы считаете, что оптимальней придерживаться принципа «всё или ничего». Я в моём случае этот принцип за максиму бы не взял.


Я выше уже написал: работает долго, есть не просит, жалоб не было.


Менюшки точно не нужны. Опять же, если требуется делать что-то сложное и много раз, лучше все эти костыли нагородить. Если можно обойтись, то тоже прекрасно, но не все и не во всех задачах могут обойтись. У меня есть некоторые несложные алиасы в шелле для gpg, чтобы вручную не вбивать однотипные команды каждый раз, выцепляя KeyID'ы из листинга gpg и рискуя забыть ту или иную опцию.

Могу ещё скрипт[link8] вспомнить. Очень удобный, полезный, вбиваю ./bin/script_name.sh [device] и больше ни о чём не думаю, он всё делает сам. Десятки раз он точно пригождался. А можно было бы сделать по-вашему: написать tipsheet, потом по одной команде дёргать оттуда и на лету редактировать под каждый случай, рискуя ошибиться. Времени уходило бы больше, вероятность ошибки была бы выше, но зато по-вашему.

Более того, ваш подход у меня ещё пока используется для ресайза шифрованных LVM. Там где-то десяток команд, которые нужно по одной копипастить в командную строку и редактировать. Получается долго, муторно, и временами ошибаюсь. Это, наверно, тоже стоило бы автоматизировать, но операция используется редко, поэтому не знаю, стоит ли овчинка выделки.

Ещё один пример — rdiff-backup. Там нужно было добавлять все нужные --exclude'ы, чтобы не засорять ФС вредной информацией. Однажды-таки ошибся, и что потом делать? После прерывания БД теряет консистентность, поэтому приходится сносить весь бэкап, убивать слот cryptsetup'а, потом заново его форматировать, нарезать ФС и снова делать rdiff-backup. Зато по-вашему. После первого фейла написал скрипт с командой запуска, чтобы больше такого не повторялось.

Я не знаю, как можно спорить с очевидным. Вы сейчас точно не троллите?


Редактируется, не вопрос, а как в этом разбираться? Вот копировали вы строчку, исправляли номера портов, а в одном месте забыли исправить, открыли в системе дырку, но всё ОК, работает. Как проанализировать правила на предмет дырок и консистентности? Отдельный интеллектуальный скрипт-парсер писать? Попытайтесь внимательно проанализировать все до одного правила из десятков — у вас крыша поедет. В продакшне всем наплевать на безопасность. Там нет такого, что утечка одного пакета в некоторых случаях приводит к катастрофе.

Я пытался читать листинги iptables. Довольно тяжёлое для мозга занятие, и вероятность упустить что-то важное велика. Один раз написать полезные функции и проанализировать их проще, чем каждый раз копипастить и надеяться, что не внёс ошибку.


Зачем усложнять себе жизнь? Я не претендую на вселенскую значимость. Здесь раза три уже спрашивали, как закрыть порты в Tor. Вот есть ответ — скрипт. Хотите, отредактируйте под себя и используйте, не хотите — проходите мимо. Зачем мне в обязательном порядке все свои наработки пытаться встроить в какой-то официальный проект? Я как раз поттерингом не страдаю в этом плане. И я не вижу никакой большой важности в нескольких самопальных скриптах-костылях, чтобы их как-то официально распространять для других. Всё это вторично и малозначимо. Если какая-нибудь бессигнатурка и отрицаемое шифрование ещё имеют смысл, то эта малочёвка — уже совсем перебор.


Ну и зря. Бывает, что задача возникает, а фиг нагуглишь, как её решать. Я поэтому придерживаюсь принципа выкладывать всё сколь-нибудь полезное.


Ну, хорошо, что в вашем случае это было for fun и теперь вы можете сказать, что оно некритично, а теперь ещё и штатно поддерживается. Но могла бы быть иная ситуация: что-то нужно кровь из носа как, а штатно этого нет и не предвидится в ближайшем будущем, тогда ничего кроме огорода собственных костылей не остаётся. Не от хорошей жизни же.


Кому-то может быть приемлемым сидеть вообще без компьютера. Как всегда, это вопрос личного компромисса между затратами, отдачей и приоритетами.
— unknown (17/02/2015 17:35)   

Как можно так переврать очевидное и совершенно неиносказательное? Скрипт на десятки тысяч строк кода, явно же написано. Не для себя, себе я бы такое не делал. И не для себя по доброй воле тоже. Просто знаю, насколько тяжело всё это поддерживать.


Именно. То в tail или head можно было без пробела цифру после опции использовать, то нельзя; то начинают в дистре тасовать между собой awk/mawk/gawk, у которых опции отличаются, причём ошибки не вылетает, а просто не работает.


Иногда это самый правильный подход. Особенно, если вы пишете для себя. Иначе получается винда и торбраузер с бинарниками, либами и конфигами в локальной директории и с локальным тором.


Одно дело — утрировать про браузер. Другое дело — сравнивать iptables с ассемблером. Да им тысячи хостов разруливают и тупо пишут скрипт :



Просто тупо список, даже без конфигов, условий, массивов и циклов, с минимумом переменных. Делается идеально аккуратная разметка, чтобы всё выглядело единообразно. В vim делается поиск и замена того, что нужно, всё управление через текстовый редактор. И так рулят тысячами хостов без ошибок. А вы, чтобы справится с одним, хотите создать свой язык? Для копания ямки под горшок построить экскаватор?


Вместо видимости «всего», честно признаём, что сделано как попало из того, что есть и нет смысла тратить время попусту на сомнительные разработки и их поддержание.


У меня тоже долго что работало, пока не пришло время обновить или разобраться в чём-то старом, добавить возможностей и пр. Оказалось, что примитивные скрипты поправить легко, а сложные — проще заново написать. И лучше в примитивном виде.


Да тысячами правил рулят и ничего. Держите их в порядке и всё.


Это вы похоже троллите. Всё равно, что придти в бухгалтерию и предложить им использовать некоммутативное умножение[link9] и прочие высшие абстракции для начисления зарплаты.

Вот я в одной теме сразу заявил, что отрицаемое шифрование в оффлайне[link10] — нереально. Но взялся just for fun, но стоило чуть остановиться, как меня подначили тонким троллингом[link11] на слабо:

Так можно про любую задачу сказать: раз ещё не решили, значит, бьются и решают. А если приглядеться внимательней, то есть, в лучшем случае, 2-3 научных коллектива, а то и вообще всего несколько человек, которым эта задача интересна. Другие занимаются другими задачами. Лишь очень небольшое число проблем удостаивается официального статуса трудных. Это проблемы, к которым, например, сводится решение множества других важных проблем. В криптографии можно легко придумать тысячу проблем-вопросов, ответа на которых наука не знает. Это не значит, что все они трудные (нахождение и постановка действительно трудной проблемы — само по себе уже открытие, но трудность надо доказать чем-то помимо «я пробовал, и у меня не получилось решить»; например — сведением к другим трудным задачам). Это значит (обычно) только то, что никто из квалифицированной публики серьёзно за них не брался.


Ппц! В итоге было найдено чуть ли не сотни работ, чтобы показать, что на этой теме не отметился только ленивый и за десятки лет никто из теоретиков задачу отрицаемости толком не решил, даже не формализовал. При этом я дошёл до предела собственной компетенции и признал, что построение даже наколеночного протокола — нерешаемо и я сваливаю с дальнейшего рассмотрения этой задачи.

Вот ещё тема, про аппаратный скремблер[link12]. Там показателен не столько протокол, сколько отдельная возможность передачи шифрованного голоса через GSM. Казалось так легко, да ещё проект JackPair якобы это смог (но не отдал наработки в паблик, что подозрительно). А там всплыло столько трудностей, столько исследователей головы ломали, что не стоит это того, чтобы браться. Или будет только ненадёжная имитация, которая при смене условий канала откажется работать. И на бесконечных доработках проект и увязнет. Проще признать, что цифровой голос внутри голоса GSM — забавная задача, но как бы не хотелось её на практике осуществлять, лучше забить.


Это только первая стадия. Хорошо, что вы не в каком-нибудь влиятельном проекте на влиятельной позиции :)


Иногда приходится. Просто буду знать, что никакой анонимности/безопасности там нет и играть в игры с полумерами можно до момента, пока они не сильно напрягают.
— SATtva (18/02/2015 16:02)   
Во срач развели только из-за того, что одному ближе экстенсивный подход, а другому — интенсивный. Господа, будьте терпимее к чужим недостаткам.
— ressa (18/02/2015 16:51, исправлен 18/02/2015 16:52)   

unknown, ты комментом ошибся) Там я Гегелю спасибо говорю)

— unknown (18/02/2015 16:57, исправлен 18/02/2015 17:08)   

промахнулся[link14].



Здесь немного более общие разногласия в плане подходов. Скорее разногласия с поисками оптимума. Просто, это странное нечто нечто странное внезапно всплыло в другой теме[link15] и там же ранее[link16], здесь хоть удалось выяснить, что это, для чего, зачем и почему (не)нужно и на каких принципах основано.



OK. Тогда проще согласиться с концом вот этого коментария[link17]:


Как всегда, это вопрос личного компромисса между затратами, отдачей и приоритетами.
Гость (18/02/2015 23:57)   

Хорошо, упростим немного задачу. Китайский код[link18] — это, по-вашему, хорошо? Если хорошо, то где хорошо и почему хорошо?
Гость (19/02/2015 08:00)   
Шелл — это простой склеиватель утилит, не надо из него пытаться сделать полноценный скриптовый язык программирования.

Загляните в каталог /etc, там куча скриптов. Например, для запуска/остановки служб используется скрипт, который использует целую библиотеку функций на bash. Причём эти функции широко заимствуются из одних систем в другие. Даже в такой минималистичной системе как LFS они присутствуют в изменённом виде.

Да им тысячи хостов разруливают и тупо пишут скрипт

Это скорей не скрипт, а база данных, формально похожая на скрипт. Количество хостов вообще не аргумент (пусть их хоть миллион будет), в скриптах главное – сложность логики. Тупой "скрипт" (по сути база) из тысяч строк может быть несравним по сложности с кодом из десяти строк. В вашем примере логика почти отсутствует, а данные относительно редко меняются, поэтому городить надстройки смысла действительно нет.

Настройки сетевого экрана нужно менять например при тестировании чтобы перейти с Tor на прямое соединение, разрешить пинг и traceroute или DNS для подключения к провайдеру когда нет роутера. Если напрямую править "скрипт" iptables, то легко ошибиться. Разумней классифицировать задачи, создать для них нужные правила и возможность лёгкого переключения между ними. Это снизит вероятность ошибки и облегчит работу. Проще разобраться с различием в настройках один раз, чем делать это многократно и в неподходящее время.

Идея со скриптованием iptables нормальная, а насколько хорошо она реализована, это уже другой вопрос.
— unknown (19/02/2015 09:50)   

Да не китайский. Вот проверка TBB[link7]:

Это скрипт не для тупого конечного пользователя, поэтому сам скрипт имеет право и даже должен быть тупым. Чем примитивнее и тупее, тем лучше. А можно приделать кучу конфигов, проверок, циклов, разные имена файлов (а не только linux64) проверять. Допустим, завтра я сяду за комп уставший, скачаю новый TBB, а там вся структура файлов внезапно поменяется. Поскольку скрипт прост, примитивен, нагляден и туп, его кто-угодно можт поправить за полминуты, даже если до этого в него не заглядывал годами или вообще не разу не видел.

Сложный код оправдан для сложных алгоритмов, но для проекта, который вы собираетесь развивать и поддерживать регулярно всё своё свободное время, чтобы в любой момент можно было делать сложные фичи, масштабировать и пр. Т.е. это перекладывание тупости пользователя в головную боль для разработчика.


Там все скрипты написаны в целом в правильной и уместной идеологии. И именно поэтому так и не надо делать там, где не универсальный скрипт (для дистра) или не в продакшн с полной автоматизацией и универсализацией для конечного пользователя, с тестированием, циклом поддержки и пр. Я уже намекал, что у меня есть опыт поддержки и тупых скриптов, и навороченных. И не для себя, а в продакшн. Это ни разу не повод для гордости, просто вы пытаетесь мне объяснить и показать то, что я уже ковырял более десятка лет. Ну т.е., если я ошибаюсь, то мне это объяснять бесполезно, я уже на этом свою собаку съел и шишек набил :)
Гость (19/02/2015 10:32)   
Если вариации скрипта тривиальны и не очень часты, то его проще править, чем программировать разные варианты. А если вариации не так очевидны, требуют умственных усилий и существует вероятность ошибиться именно в логике, а не при наборе на клавиатуре? Лучше напрячься один раз, заложить всю сложность в скрипт и отладить, чем регулярно воспроизводить её в голове.
Гость (19/02/2015 12:33)   

Только потому, что они написаны там и кем-то, а не мной? Ну вот я, например, пытался немного курить стартовые скрипты rc.d, init.d и т.п. Пытался разобраться, как в примитивной NetBSD запускаются консоли при старте. Там какой-то wscons-скрипт есть. Он с функциями, редиректами, case'ами и всем остальным. Понял не сразу и не всё, скажу определённо. Разбирался, потому что чтение системных конфигов почему-то не работало, как надо. Что-то в итоге пофиксил, что-то нет. Но я согласен в целом, что многие стартовые скрипты — это страх и ужас, и по уму это надо делать не на шелле, а на чём-то более умном и удобном. Но тут опять же всё дело в традициях и legacy.

Если быть последовательным, то systemd вроде как пытался решить эту проблему, как и pulseaudio для работы со звуком и др. проекты Поттеринга. В лурке про Поттеринга все эти аргументы приведены. Ну т.е. якобы движение правильное и в верном направлении, а то, что временно всё сломалось, было неизбежным. Если последовательно к этому подходить, то вы, unknown, должны быть всеми руками за в пользу systemd, но почему-то это не так. Вы предпочитаете сложные навороченные заскриптованные ужасы старта системы System V. Как же так?


Никто не застрахован от ошибок. Человек ошибается, даже техника глючит. Поэтому в критических случаях кругом подстраховки, дубляж, автопилот. По-максимуму стараются избегать сложной последовательности рутинных действий.

Например, я для себя опредилил 2 простых правила: не втыкать сетевой провод, пока не загружена система, и вытыкать его до ребута (потому что не знаю, как там меняется мак-адрес, и у меня это делается вручную). Как бы ни старался и не параноил, за несколько лет я успевал нарушить это правило не раз, не два и не три, так что мой мак успел утечь к провадйеру n-ое число раз. Кстати, в скрипты я смену мака внёс только после того, когда очередной раз забыл его вручную сменить, а опомнился, уже когда dhcp был запущен с настоящим маком. Да, схватился за голову, а что делать? Всё, поздно уже. Можно много месяцев играть в прятки, а потом одним неосторожным действием разрушить всё.

Другое правило было — выдёргивать провод, когда монтируются оффлайновые разделы. Про него могу сказать ровно то же самое: рано или поздно осечки начали случаться. Если нужно редактировать скрипт, рано или поздно вы ошибётесь, это неизбежно. Не поможет ни vim, ни всё остальное. Не туда нажал, не там отвлёкся, задумался, не исправил что-то, забыл о чём-то — и всё, система оказалсь открытой. Я себя столько ловил на этих нюансах, что теперь стараюсь по-максимуму убрать ручное вмешательство везде, где это можно.

Было дело, забыл, например, отключить логи в privoxy. Когда-то включил для отладки и забыл. Узнал об этом много месяцев спустя, когда случайно чистил домашнюю директорию. А там оказалось, что писались все ссылки, всё в мельчайших подробностях, все веб-логи, за много месяцев. И все эти месяцы я спокойно думал, что хоум у меня чистый и ничего такого там нет. Я после этого очередной раз схватился за голову и сказал сам себе, что я не верю возможность ИБ.


А что сложного в моём коде? Несколько функций + незначимые алисы (можно было и без них). Если очень надо, можно просто написать правило iptables без всяких алиасов, оно тоже будет понятно. В чём проблема?



Я[link19] вообще в последнее время подумываю об интеллектуальном дауншифтинге.

М[link20]ожно впадать в маразм.

[медицинское]
Коллеги, очень жаль, но, похоже, мы теряем его. ☹ SATtva, проверьте пульс ещё раз. Кетамина[link21] больше не надо, он не помогает ему. Позвоните родственникам, поговорите о наследстве, кому должен достаться аккаунт на pgpru и пост модератора.
[/медицинское]
— unknown (19/02/2015 14:51)   

Я могу (мог когда-то) написать также. Я когда-то также и писал, не для себя, а в проект. Для проекта, который будут использовать много людей и который будет для них оперативно поддерживаться — это нормально: чуть хуже, чуть лучше, но концептуально годится со всеми неизбежными наворотами. Для себя (не в проект) — это часто не оправданно. Если вы будете делать свой Tails, Whonix и пр. Liberte — тогда оправданно. А для себя или для обмена с кем-то — IMHO не оправданно.


Pulseaudio решает часть проблем со звуком, начисто игнорируя другие. Поттеринг открыто сказал, что ему покласть на обработку сигналов и музыкотворчество. Подозреваю, что и на безопасность в плане контроля над системой и анонимность ему также покласть. Он делает универсализацию, расставляя за всех приоритеты. Это вы делаете по Поттерингу: пытаясь нагородить сложные универсальные абстракции там, где не нужно и в ущерб восприятию.


Я понимаю, прятать мак в разовой поездке в далёкой стране, где подключаешься пару раз. Тогда и перешить можно. Или стартовать сеть вручную, как запуск космического корабля с ручной проверкой всех систем. А прятать mac от постоянного провайдера? Проще решить, что это бесполезно.


Необходимость поддержки автоматического вмешательства подводит ещё больше. Ключевое слово и слабое место в автоматике — поддержка. Самые критические системы поэтому и сидят на всяком десятилетиями неменяющемся старье — изменения поддерживать слишком дорого. Дороже примитивного полуручного управления.


Я исхожу из максимы, что не бывает чистого хома, /var, /tmp и пр. Кто залез в расшифрованный комп — тот знает всё. На мелкие подстраховки нет смысла тратить слишком много усилий.


Ничего. Он простой, если вы его сами написали или если потратить время, чтобы его разобрать и помнить. А если спустя месяцы в него заглянуть или первый раз — набор каких-то самопальных абстракций. Стандартный дистровый /etc — там может такой-же ужас и даже хуже, но он и в Африке /etc, один раз выучить и много где пригодится. Он лучше тем, что его пропихнули в негласный стандарт, неважно насколько он убог и кто его написал. Не нравится — меняйте стандарт, пропихивайте своё как Поттеринг.


Меня чья-то якобы непоследовательность почти никогда не удивляет в плане желания требовать объяснений, выводить на чистую воду, искать противоречия. Я обычно могу воспроизвести контекст восприятия другого человека, пусть и с ошибками (в чужую голову не залезешь), но я обычно понимаю, почему кто-то думает именно так и почему оба взаимоисключающих мнения разных людей часто почти равноправны — дальше определённой модели восприятия не вылезешь, надо или строить новую, или выжимать максимум из имеющихся. Абсолютно правых не бывает. Пусть каждый останется прав в своей области. Можно даже оперировать сразу несколькими взаимоисключающими моделями в одной голове, пытаясь посмотреть — какая победит и даст больше профита, можно оперировать разными языками, системами понятий, имитировать чужую логику, но тогда люди понимают такую позицию ещё хуже (они начинают всерьёз думать про кетамин, маразм, множественные личности и пр.).
Гость (19/02/2015 22:57)   

При нажатии Ctrl-Alt-Del более семи раз за интервал в две секунды теперь выполняется немедленная перезагрузка, но с корректным отмонтированием всех разделов

Так работает systemd[link22].
— unknown (20/02/2015 12:04, исправлен 20/02/2015 12:34)   

Копипастну сюда весь список из вики:
Domain-specific language: Advantages and disadvantages[link23].


Some of the advantages:[1][2]

  • Domain-specific languages allow solutions to be expressed in the idiom and at the level of abstraction of the problem domain. The idea is domain experts themselves may understand, validate, modify, and often even develop domain-specific language programs. However, this is seldom the case.[6]

  • Domain-specific languages allow validation at the domain level. As long as the language constructs are safe any sentence written with them can be considered safe.[citation needed]

Some of the disadvantages:


  • Cost of learning a new language vs. its limited applicability

  • Cost of designing, implementing, and maintaining a domain-specific language as well as the tools required to develop with it (IDE)

  • Finding, setting, and maintaining proper scope.

  • Difficulty of balancing trade-offs between domain-specificity and general-purpose programming language constructs.

  • Potential loss of processor efficiency compared with hand-coded software.

  • Proliferation of similar non-standard domain-specific languages, i.e. a DSL used within insurance company A versus a DSL used within insurance company B.[7]

  • Non-technical domain experts can find it hard to write or modify DSL programs by themselves.[6]

  • Increased difficulty of integrating the DSL with other components of the IT system (as compared to integrating with a general-purpose language).

  • Low supply of experts in a particular DSL tends to raise labor costs.

  • Harder to find code examples.

Согласен практически со всеми пунктами. Вопрос лишь в балансе достоинств/недостатков. Считаю, что DSL особенно для iptables и особенно на шелле сильно перевешивает по недостаткам. Тема началась именно с iptables, но это касается многих других случаев попыток нагородить самопальный метаязык/DSL для поддержания ИБ в системе.


Про скрипты[link24]:


Unix shell scripts give a good example of a domain-specific language for data organization.

In practice, scripting languages are used to weave together small Unix tools such as AWK (e.g., gawk), ls, sort or wc.

Набор мнений на вики — конечно не истина в последней инстанции, но как-то отражает общую практику, что шелл — просто склейка между утилитами, как-то внутри него метаязык со своими абстракциями стараются особо не городить. Хотя в статье про метапрограмминг[link25] такой пример есть и для iptables он бы выглядел более практично, чем то, что там приведено.

Гость (21/02/2015 19:33)   

Близится второе, похоже. Снесли настройки прокси в торбаттоне[link26], теперь нельзя просто так настроить прозрачную торификацию.
И всё почему?
As far as I understand, this tab is redundant or mostly redundant. One of the UX test users was confused by it
Ну всё правильно, настройки для пользователей, а гики конфиги руками править должны. Если только поддержка нестандартных настроек продержится в коде чуть дольше.

Впрочем, речь про торбраузер, а не про тор. Просто возвращаемся в эпоху до торбаттона с торбраузером.
Гость (22/02/2015 00:30)   

У меня работает без пробела и, по моим скромным представлениям, так было всегда. ☺


У подхода портабельности и TBB (как и вообще винды) есть свои слабые и сильные стороны. Например, среди плюсов то, что всё в одном месте — не надо переставлять половину системы, чтобы обновить одну конкретную программу. Минусы тоже понятны.


А сравнение в целом корректное. На асме тоже иногда пишут сложные вещи, когда выжать несколько процентов производительности страх как надо. Я клоню к тому, что iptables действительно слишком низкоуровнев для тех целей, для каких используется (файерволл), нереально низкоуровнев.

Многие вещи можно делать без утилит — писать простенькие программы на сях, которые будут дёргать нужные syscall'ы ядра. Представьте себе, что утилит действительно нет, а вместо этого прилагается мануал о написании таких C-программок — вот это именно что уровень iptables. Это уровень низкоуровневой манипуляции внутренними системами ядра, а не уровень фильтрации пакетов в его человеческом смысле по IP источника и IP назначения.

Сейчас много что делается через утилиты из того, что доступно через procfs. Например, мне недавно надо было понять, как поменять яркость экрана. Вроде оно и не сложно, но какой-то непонятный страх и ужас от этих мануалов берёт с нулевым пониманием. Зато, оказывается, есть удобная утилитка xbacklight, которая в человечески понятном виде устанавливает яркость, какую хотите:
$ xbacklight -set 70
Правда, работает только из-под иксов. ☹ А ведь можно было бы и так:
$ [культ вуду]
echo "какая-то хрень с непонятными параметрами" > \
/proc/путь/куда/макар/телят/не/гонял/болото
$ [ещё культ вуду]


Если таких горшков надо вырыть не один (и с параметрами, определёнными раз и на века), а тысячу, то разумно подумать об автоматизации процесса. Картошку массово тоже уже руками не копают, хотя любителей тру хоть отбавляй.


Вы когда-нибудь занимались програмированием? У меня частенько возникает задача: я написал модуль, он как-то работал. Потом надо что-то исправить или написать аналогичный. Я уже всё забыл, есть только код и какие-то комментарии. И мне нужно заново понять, что он делает, чтобы пофиксить. Вот наглядный примерчик подобного кода:



Иногда сидишь и день-два вспоминаешь, что там работает, как и почему, даже пяти строк комментариев к каждой строчке кода не хватает. И всё-таки понять написанное проще, чем написать заново. На фоне этого такие скрипты iptables — раз плюнуть и растереть. У вас когда-нибудь было такое, что за пол дня удаётся написать пять строк кода, а перед этим требуется часа три непрерывно думать? Ну да, бывает такое, что 5 строчек в плане того, что внутрь них зашито, содержательны больше, чем некоторые тупые программы на сотни строк. Тут что пять строк в программе, что пять рэперных промежуточных действий в аналитических вычислениях — одно и то же. Одна формула — одна строка в программе.


Наверно, мой коммент покажется банальным, но всё-таки: сложность работы можно оценить только тогда, когда она уже сделана (это как «доказать несуществование нельзя, можно доказать только существование»). Когда предъявлено финальное решение, можно с чувством исполненного долга думать о том, насколько это было сложно или просто. По крайней мере, есть рабочий документ — статья, которую можно обсуждать. После статьи есть цельное представление о проблеме и конструктивные мысли об упрощении. До статьи нет ничего.

Этот вопрос такой же, как «насколько сложно доказать математическую теорему?». Вдруг все бьются, а у задачи есть простое и изящное решение? Таких примеров миллион. И есть единицы примеров, когда решение найдено, оно сложное, и в него можно ткнуть пальцем. Короче, пока доказательства нет, никто не знает, насколько сложно доказать прямое или обратное. Например, есть примеры из функционального анализа, на изобретение которых ушёл не один десяток лет, но сами примеры простые для понимания, их рассказывают на лекциях студентам (но вот догадаться до таких примеров самостоятельно уже сложно).

В моей практике тоже хватало примеров, когда месяцами ищешь решение, а когда нашёл не перестаёшь удивляться, почему ж до такой простоты не мог догадаться сразу. Как всегда, все неидеальны, и каждому не хватает опыта, знаний, интуиции, но всё как-то развивается. Когда я нахожусь на более высоком этапе, где задачи уже в десять раз сложнее, я всё равно скептично переношу свой ранний опыт на текущую ситуацию и думаю, что лет через 10 всё, что я сейчас делаю, наверно, мне тоже покажется пущей банальностью.


Я не следил за темой, но мне показалось, что хочется не просто передавать голос, а чтобы было ещё нечто, где это «нечто» — большое количество плюшек для пользователя и ограничений для системы коммуникаций. И вот это «нечто» уже делало задачу трудной.


Ничего, это, возможно, ещё впереди. :)


Главное — не закончите как Ульбрихт, Маркес или McGrath[link27], а то они тоже решили не страдать полумерами в плане защиты и на том погорели. ☺


Одним интересней самим играть в футбол, а другим — наблюдать, как играют другие. SATtva, почему вы никогда не присоединяетесь к нашим уютным познавательным срачам? Истина выясняется только в срачах! Срач как способ познания реальности. Ещё раз не придёте на срач — прогул поставлю, вы и так уже слишком много пропустили.


«Ранее» — это явно пример практически write-only-кода, так что можете воспринимать его как разновидность just for fun. В обсуждаемых скриптах iptables никакой подобной дичи, конечно же, нет. ☺


Вам это нужно, и вы автоматизировали. А я просто по старинике копирую файл в нужную директорию и руками выполняю gpg --verify. Мне этого пока достаточно, и я не вижу смысла в большем, но тех, кому нужно большее, понимаю и не осуждаю.


Завтра может упасть на голову кирпич. Придётся сесть и разобраться, не впервой, c'e la vie.


Вы переоцениваете. Я могу сходу штук 10 вопросов к нему задать. Внимательно на него поглядел, понял не всё. Ну, т.е., общий смысл понятен, но слепо доверять я бы не стал, не перепроверив, как это работает в командной строке вручную:

  1. Зачем писать echo "" > file.txt и т.п.? Это принудительный перевод строки в файле? А проще никак без таких костылей?

  1. sha256sum -c sha256sums.txt 2>&1 | grep OK >> file.txt ← скажу сразу, что не знаю опцию -c. Мне придётся открывать man, чтобы узнать.

  1. С редиректами потоков тоже много своих приколов. Вашей команды «gpg --verify tor-browser-linux64*.asc >> file.txt 2>&1» это тоже касается. По человеческой логике вначале обрабатываем поток (2>&1), а только потом его перенаправляем в файл через >> или >. Но реально надо делать в обратной последовательности. Почему — это, как мне давно объясняли, следует из внутренней логики сей, и, чтобы это понять, нужно знать, как на сях это реализовано.

    Кроме того, бывают дополнительные дескрипторы потоков кроме первого и второго. Например, я недавно сталкивался с тем, что какая-то программа упорно писала нечто на терминал, что я никаким образом не мог автоматически запихать в файл так, чтобы там было ровно то, что выводится на терминал (и ровно в той же последовательности).

Короче, для вас это просто, потому что вы этот скрипт писали, тестировали и разбирались с ним, но если в него заглянет другой, он ему простым может не показаться, так что ваши слова про пол минуты — преувеличение.


Они неуниверсальны, о чём я сразу сказал, они для параноиков и анонимности. Хотите — пишите каждый раз по 4 однотипных правила iptables для каждого демона на lo, в которых как нарочно будут такие тонкости в отличиях, что вы обязательно запутаетесь. Я вот их положил в функцию и больше не страдаю фигнёй.


Оно почти так и есть, поэтому вы часто не понимаете то, о чём пишу я, а я — то, о чём пишете вы. ☺ Когда вы говорите о криптографии как абстрактной математике, тезис о младшей сестре вам понятен, а когда говорите о практике — уже нет. А я его распространяю и на практику, в этом отличие. Конечно, на 100% я распространить не могу, бункера ибо нет и не предвидится, но всё же можно на коленке сделать довольно многое.


И будет ещё один потенциальный пунктик в потенциальном ордере: «MAC-адрес оборудования совпадает с тем, который осел в логах ISP, так что говорить о том, что к сети подключался какой-то иной компьютер, не приходится». Оно вам надо?


Они[link27] [эта славная троица], наверно, тоже так думали. ☺


Я тут выше примерно то же самое написал про ваш скрипт. ☺


Вот и получается, что Поттеринг хорош просто тем, что он Поттеринг, хотя выше по треду вы его ругали. ☺


Наверно, всё же не логику, а аргументацию. Логика-то одна.


Любой непротиворечивый взгляд на мир потенциально имеет право на существование, противоречие же разрушает всё до основания. Не бывает такого, что в теории всё хорошо, но одна теорема просто противоречит другой. Этого не может быть. Можно строго показать, что любое одно противоречие достаточно для разрушения всей теории. Кажется, где-то говорилось, что исходя из противоречивого утверждения можно доказать любое наперёд заданное, т.е. уравнять все утверждения между собой в их равноправности, а это и есть крах теории — ноль селекции утверждений, всё равноправно, вы ничего конкретного не можете выбрать ни из чего. Можно говорить о нерелевантности математической картины мира для реальных вещей, но как нулевое приближение к нему всё же аппелируют везде, где могут (например, в той же юриспруденции и праве).


Да, ищется естественный язык для конкретной задачи, на нём она и решается вместо того, чтобы переводить эту задачу на совершенно ей неестественный GPL (general purpose language). Задумка красивая и концептуальная. С практической точки зрения она ограничена лишь умностью компилятора. Здесь подвижки тоже есть. Говорят, сейчас для языков высокого уровня уже есть такие компиляторы, которые умнее человека, т.е. ни один человек за разумное время не поймёт, как написать более оптимальный (быстрый) код на ЯП низкого уровня (том же си), чтобы было быстрее.


В идеале вы не изучаете чужой язык, а пишете свой. Чукча не читатель, чукча писатель. :-)


IDE ненужно. Для серьёзного концептуального программирования оно не нужно (да, весь опыт коммерческих компаний и сотен тысяч макак здесь неприменим). Есть одна книжка, которую написал крутой чел, детали не помню, но вроде он LISPер. Там он сказал о своих личных предпочтениях: vim не нужен, достаточен vi. Подцветка для ЯП тоже ненужна, поэтому vi достаточен.

Он хотел сказать примерно следующее: подцветка — это маскировка недочётов языка, когда нужно что-то ещё кроме слов, чтобы сделать программу более выразительной для человека. Но концептуальный язык на то и концептуален, что он как человеческий, по сути декларативный. Вас не смущает, что большинство книжек чёрнобелые, и подцветки там нет, а восприятию это не мешает? Вот типа серьёзная программа на LISPе она должна быть такой же. Аналогично и IDE — это костыли для подпорок несовершенства языка и/или метода программирования на нём. Я, кстати, раньше тоже пользовался IDE, но потом перешёл на vim и отвык от IDE. Назад возвращаться не хочется. Для меня редактор программ — это просто редактор, а отладку можно и в командной строке делать удобно, если уметь.

Не могу сказать, что я сам поначалу воспринял слова про подцветку, но автор своим авторитетом заставил меня глубоко задуматься. Возможно, он прав, хотя я очень привык к подцветке и не представляю жизнь (в обычных GPL) без неё, как уж в DSL — не знаю.


Worse is better. Побеждает не лучший, побеждает удобный для масс. Много хорошего померло просто потому, что было слишком хорошо, и, как следствие, его так и не смогли осилить широкие массы, а узкие профессиональные круги не смогли вытянуть на должный уровень развития, в итоге победили корявые и глючные инструменты (массой и шапкозакидательством).


Не боги горшки обжигают. ☺


Я сразу сказал, что шелл — это потому, что самое простое из доступного и того, что знаю, полноценный DSL и не планировался, хотя идея DSL держалась в голове (но не как конечная цель, а как сама идея-ориентир).


This script (or program) generates a new 993-line program that prints out the numbers 1–992. This is only an illustration of how to use code to write more code; it is not the most efficient way to print out a list of numbers. Nonetheless, a programmer can write and execute this metaprogram in less than a minute, and will have generated exactly 1000 lines of code in that amount of time.

Всё правильно. Вместо того, чтобы писать руками тысячи однотипных правил iptables, надо сделать кодогенерацию и заставить программу написать их. Даже в wiki это понимают, а вы — нет. ☺


С JS было[link28] точно так же.


Меня тоже это legacy смущает. Как это появилось? Они скопировали один-в-один настройку сети через сам интерфейс firefox: «Edit → Preferences → Advanced → Network → Settings». Не знаю, зачем им это понадобилось, но после этого появились два способа настройки сети: из интерфейса torbutton'а и из интерфейса самого firefox'а. Когда-то в torbutton'е, кстати, настроек сети, насколько я помню, не было. Итак, мы долго жили с двумя параллельными настройками, где настоятельно рекомендовалось не лезать в firefox'овские, а менять всё через torbutton'овские. Зачем тогда нужны первые? Почему бы их не убрать с глаз вообще? Оставили, наверно, для какой-то совместимости. Ну, хорошо, я знаю всю эту историю, но того, кто видит TBB первый раз, это может запутать.

Что касается самих настроек, тут замечание тоже правильное: кто сейчас будет устанавливать в TBB вопреки всем рекомендациям по безопасности раздельные типы прокси для разных протоколов? Понятно же, что нужна только одна настройка — SOCKS. Ну, и ещё кнопка, которая включает и отключает использование прокси (для прозрачной торификации).

Наверно, всё то же можно править и через about:config, как сейчас делается включение/отключение JS. Одним словом, некая логика в этом тикете есть, но надо посмотреть, какая будет реализация. Даже если будет принудительно задано 127.0.0.1:9150, достаточно заставить системный Tor слушать на 9150 как на SocksPort. Это, кстати, может и не противоречить прозрачной торификации — зависит от конкретных правил iptables.
— SATtva (22/02/2015 10:30)   

Спасибо, я как-нибудь со стороны позанимаюсь вуаеризмом. Новый движок сам себя не напишет.
Гость (22/02/2015 11:37)   

А мы уже не ждём, не надеемся, не верим. ☹
— SATtva (22/02/2015 15:15)   
Напрасно, работа идёт.
— unknown (22/02/2015 15:17)   

Я примерно так вашу позицию и представляю:


  1. Iptables слишко низкоуровневый (аналогия с ассемблером).
  2. Раз он такой низкоуровневый, значит нужен метаязык (опять же аналогия со всем множеством языков над ассемблером, компиляцией и пр.).
  3. Раз готового метаязыка нет, то надо его создать самому.
  4. Если не создать глобальный метаязык в виде фундаментального проекта, то надо создать метаязык под конкретную узкоориентированную задачу (Domain-specific Language).
  5. Чтобы не лезть в сложную объектность и функциональщину, используем самое простое, распространённое и стандартное для решения задачи из п. 3., т.е. — шелл.
  6. Подразумеваем, что затраты на создание, реализацию и поддержание проекта дают нам PROFIT по сравнению с прямой вознёй с низкоуровнемы средствами из п.1

Допустим, я правильно переформулировал ваши мысли в эти пункты, ничего не переврал, не сильно упростил и т.д. Если согласиться со всеми пунктами и логическими переходами между ними, то всё правильно, продолжайте делать так. Но лично мне эти пункты не подходят, у меня возражения ко всем, начиная с первого и по поводу переходов между ними тоже. Тратить время на разбор ситуации и предлагать альтернативное конструктивное решение желания нет, т.к. лично для меня нет собственно и проблемы. Ну и конструктивной критики тоже нет по этому.


Вот это раз и навека обычно и подводит. У меня в iptables раз и навека уже и так хватает неизменяемых правил, которые в автоматизации не нуждаются, так что городить автоматику смысла нет. До автоматизации надо пройти критический порог. Если я сейчас введу автоматику и раз и навека её заброшу, то будет сложнее вспомнить, что нагорожено в этой самопальной автоматике, чем заглянуть в man iptables. Да и горшков мало. Один раз можно и вручную расставить по фэньшую.


Согласен, отличный пример дикого кода. Здесь коменты слабо помогут — нужна дока в виде пэдээфки с описанием алгоритма, псевдокодом, формулами и пр. И опять же, не зная предметной области, к которой относится расчёт, разбирать этот код сложно. А если вы не сторонний программер, а инженер/проектировщик/теоретик/специалист, все эти формулы и методы наизусть помните и считаете по ним регулярно, то тогда доки может и не нужны, коментов достаточно.


Даже в науке до тех пор пока теория подробно не разработана, то принимают решения даже по тому, что неизвестно. Кулуарно, негласно, интуитивно, понимая, что это неправильно и необоснованно, но принимают. Какие-то направления считаются вполне научными, но маргинальными, т.е. оно там вроде как перспективно, может даже когда-то у кого-то и получится, но пока кладбище неудачных теорий переполнено, дорога к успеху устлана трупами и неизвестно, ведёт ли дорога на самом деле к успеху. Если вам кроме этой дороги нечем заняться, манит только туда, тогда можете попробовать, а если нет — то это нерациональная стратегия выбора цели, ведущая к исчерпанию ресурсов.


Как мы тут не смеялись над принципом «мне нечего скрывать», но он работает хотя бы не для нижней, а верхней планки как рациональный ограничитель паранойи в деле оценки рисков и расходования ресурсов (времени, сил) на защиту. Возьмём обратный крайний пример этим трём персонам. Если человек не занимается криминалом и серой околокриминальной зоной, если он не лезет туда где власть и деньги (не активист, живёт на копейки от получки до получки, и на большее в жизни не расчитывает), то у него другая модель угрозы (атака соседки-скандалистки и соседа-алкоголика, а не всемогущих спецслужб). Если он кому-то косвенно мешает, против него проще фальсифицировать правдоподобно выглядящие обвинения на основе общедоступной информации, чем пытаться выведать какие-то ценные секреты, которых у него, скорее всего, просто нет. Представьте, что у большинства людей не только личная информация и приватность не стоят слишком много, даже их жизнь не слишком дорого стоит и никому не нужна кроме них самих, да на них всем плевать, как бы они не компенсировали собственную незначимость паранойей вселенской важности. Т.е., можно переформулировать «мне нечего скрывать» на «я готов скрывать вот это, затратив на это столько», или «мне есть, что скрывать, но только до такого предела». Т.е., должен включаться принцип ограничителя ресурсов и некий «паранойя-стоппер» против истощающего ресурсы параноидального перфекционизма.


Думал, что нужно, а потом оказалось, что ненужно из-за затрат по поддержанию. По мере опыта вырабатывается чутьё на «ненужно», способность его отсеивать, не тратя время на формальный разбор. «Ненужно» — это что-то вроде подсознательного стоп-сигнала для перерасхода интеллектуальных ресурсов. Примерно, как сортируете публикации, не вычитывая их всех до одной. Один из самых последних фильтров — вроде всё логично, авторы авторитетные, журнал топовый, но сама эта область неинтересна, некогда тратить время, пусть полежит пока другие больше не раскрутят.


Тоже могу сказать и про хитрое скриптование iptables. Во многих случаях удавалось побывать по обе стороны процесса — предлагать то, что считаешь нужным, а затем самому же, даже без внешних аргументов, поспорив сам с собой, придти к выводу о ненужности. В принципе тоже, понимаю, но не осуждаю. Осуждаю только самоуверенность в духе того, что некое решение правильное для всех без отсутствия достаточных разъяснений.


Способность к мелочным придиркам феноменальная! Не каждому дано. Главное, чтобы общая картина за деталями не пропадала. Правда у некоторых бывает и наоборот — не видят деталей за общей картиной и трудно сказать, что лучше или хуже. Главное, найти область применимости.


Там кое-что можно сделать по другому, но это совсем уж примитивный стиль, который понятен тому, кто регулярно пишет и читает много всякого скриптописательства. Там же нет ни одной самовыдуманной абстракции, все костыли — общепринятые и конвенциональные, а потому подразумеваемые известными. А вы всё время пытаетесь их запрятать под капот собственных абстракций. Такое запрятывание — вполне разумный и правильный подход, если не доводить до абсурда и помнить о его недостатках и ограничениях.


Хорошо, хоть ограничили задачу.


Вот. А затем нужно будет скопипастить такие же правила, но с маленьким отличием и функцию придёться править, т.к. в ней какой-то фичи не было заранее предусмотрено. С маленьким ограниченным статичным и логичным мирком прекрасно работают оба подхода, с функциями конечно красивее и удобнее, но можно перебиться и быдлокодингом. А вот при смене обстоятельств вылезут недостатки обоих подходов.


С вами ) неприятии выч.-стойкой безопасности и стремлении к инф.-теоретической полной любой ценой.


Под задачу и обстановку это надо всё взвешивать. Если реально утекает куда больше информации (в т.ч. не через средства связи), чем MAC, то это затыкание пробоины пальцем.


Не получается. Это особо неприятная ситуация — протаскивание чего-то концептуально сомнительного в негласный стандарт, чтобы хорошее долгие годы не могло с ним конкурировать. Но если стандарт убьёт все альтернативы так, что их будет сложно поддерживать, то да — стандарт лучше самопальных и хотя бы негласно стандартизированных костылей. К сожалению.

Это как с тором. Разрабы часто взвешивают — защита от атаки X потребует m ресурсов, а повышение популярности сети и числа участников — n ресурсов. Есди m > n и за счёт тупого роста сети удаётся лучше справиться с атакой, то умную защиту от неё не делают.


Вот оно! У каждого человека есть базовые принципы, которые он даже не всегда полностью осознаёт и аппелирует к ним как к чему-то самому-собой разумеющемуся и единому для всех. На самом деле никаких базовых принципов нет, под ними лежат ещё более базовые. Человеческое (антропоморфное) знание — нелогично и т.д. Вы исходите из того, что мир познаваем, что ничего принципиально непознаваемого и нерационального нет. Я из этого же исхожу, но противоречие есть. Для вас познаваемость — абсолютная ценность, вы не признаёте существование неизвестного и не хотите оперировать с ним. Для вас есть познаваемость в инф.-теоретическом смысле. А для меня — в вычислительном. Если я ограничен ресурсами на познание, то для меня это практически непознаваемо. Т.е., всеобщая познаваемость не абсолютна, а утилитарно и ресурсно ограничена. Кстати, большинство людей (ИМХО) — или совсем иррационалы, или ближе к прагматикам, считающим ресурсы. Вы в какие-то редкие идеалисты попадаете. Впрочем, деление условно, можно невзаимоисключающим образом попасть сразу в несколько взаимоисключающих категорий одновременно. Вопрос — как определить, ограничить и отсортировать параметры, по которым выбирать исключения.


Мне нравятся красивые и концептуальные задумки. Особенно нравятся на бумаге, а не на практике. Пусть их кто-то другой внедрит или я воспользуюсь уже чужим внедрённым решением. Или не воспользуюсь. Но раз нет способности внедрять своё, то можно потратить ресурсы на что-то другое.


Вот этот идеал для меня сколь теоретически прекрасен, столь и практически ужасен :-) Ну если я неспособен так делать на практике, а вам именно так удобнее — рад за вас. Хотя могу и не верить. И себе тоже могу не верить — запросто. Любой может убедить себя и окружающих, что ему удобно то, что на самом деле таковым не является. И долго заметать недостатки своего подхода в обёртку из красивых идей.


Это отдельный концептуальный вопрос и с отсыткой к авторитетам могут получиться разные казусы. Может выясниться на рабочих примерах, что для образцово-концептуальной вещи не нужно концептуальное программирование, а критически важные системы работают или на быдлокоде, или вообще не работают. Мир не совершенен для красивых концепций.


Подозреваю, что на самом деле всё ещё хуже (даже если убрать всё плохое, то хорошее всё равно само найдёт себе причины для саморазрушения и помрёт), но пока не созрел для формулирования таких глобальных механизмов в вопросах «почему побеждает это, а не то».


Я иногда не понимаю даже то, что я понимаю ☺ Т.е., всегда держу в голове перспективу, что всё мной или кем-либо сказанное, доказанное и проверенное может внезапно оказаться бредом. Целостная и непротиворечивая картина мира — недостижимый идеал. Приходиться пользоваться неидеальными реализациями оракулов, даже не имея абсолютных доказательств их сводимости к идеалу.


У меня пока только первая стадия — пропали ресурсы времени на разбор и подготовку содержательных новостей и статей. На бесплодные ненапряжные срачи на форуме времени ещё хватает, его даже чуть больше, за счёт того, что оно выкраивается короткими, но многочисленными урывками. И это время не взаимозаменяемо — разбор публикаций (так же как, наверное и кодинг движков) требует больше усилий, чем релаксационно-развлекательная трепня на форуме. Я именно это имел в виду под «интеллектуальным дауншифтингом». Так что за наследство моего модераторского аккаунта пока не беспокойтесь. В крайнем случае ресурсы будут оптимизированы под почётное немногословное модераторство, примерно как у SATtv'ы ☺
Гость (26/02/2015 05:16)   

В тему треда: напишите бредогенератор кодогенератор, т.е. пусть движок пишет за вас программа. ☺


Да, всё так.


Если обсуждаются плюсы и минусы каких-либо тьюринг-полных языков, такую оговорку можно будет произнести всегда.


У вас не бывает такого, что внезапно оказалось нужным добавить ещё один SockPort для какой-нибудь программы?


Одно другому не мешает. Можете вообще не заглядывать в автоматику — просто выполните скрипт, т.е. загрузите правила, а потом сделайте iptables-save > file. Далее можете file редактировать руками, как вам хочется, на сыром низкоуровневом iptables, а потом снова загружать его через iptables-restore < file. Кстати, man iptables-extensions вас не смущает? Почему весь это функционал — «extensions» (т.е. костыли, требующие всяких там -m tcp), а не часть основного функционала?


Для ряда модулей всё это тоже имеется, куда ж без этого.


Зависит от сложности. Такого, что помнится всё, конечно, нет.


Кстати, вы сами же приводили пример касательно сложности/простоты — это sponge construction, которая должна впоследствии сделать ненужными множество наворотов в SSL и др. протоколах. Долго считалось, что иначе никак, городились сложные велосипеды... а потом выстрелил KeccaK и в раз всё это оказалось ненужным, хотя тоже казалось непобедимым. В итоге всё стало проще, понятней, конструктивней.


Законы таковы, что скоро само пользование интернетом станет криминалом, причём во всех странах. Кто здесь не пират, пусть первый кинет камень поднимет руку.


Мысль понятна, но всё равно сквозит то, что вы исходите из своей ситуации, и вам хочется её механически перенести на всех других, а это неправомочно. Тема «зачем вам ИБ?» всплывала здесь неоднократно, но ведёт к оффтопу[link29]. Мне есть, что на это сказать, и даже часто хочется сказать (это очень веские вещи), но вот так просто взять и сказать нельзя, потому что всё, что здесь, в публичном месте, произносится, записывается, прочитывается, запоминается на века и в любой момент в будущем может всплыть в самый неудачный момент.

Н[link30]е сообщайте в них больше, чем готовы сказать прокурору.


Я основной аргумент уже сказал. Вы полагаетесь на свой опыт, а я на свой, он у меня тоже есть. Я годами сидел на чистом iptables, время от времени редактируя его под свои случаи, а после этого сидел и на автоматике какое-то время. Мой опыт мне говорит о том, что на автоматике намного удобней, поэтому она (для меня) себя оправдала на все сто.

Другие имеют полное право мне не верить и придерживаться иного мнения, аппелируя к какому-то своему опыту. Однако, если кто-то хочет сделать что-то подобное моим костылям, он может взять их за основу и творчески переработать — это будет проще, чем писать и придумывать их с нуля.


Нам за это деньги платят. ©

Мне иногда хочется написать какой-то небольшой текст на тему «ад перфекциониста математика», но всё удачных примеров нет, чтобы на чём-то очень понятном и повседневном объяснить, как приходится по 10 раз переписывать одно предложение, потому что все первые 9 его вариантов, которые приходят в голову, содержат либо грамматические ошибки, либо логические неточности, либо неполны, либо недостаточно информативны, либо наоборот содержат избыточную информацию, не относяющуюся к сути обсуждаемого вопроса, а потом она только путает. Общая теория к этому уже есть [1][link31], а красивого примера к ней нету.


Очень такая стандартная оговорка, но всё же считайте меня живым примером. Я не вылажу из командной строки, но твёрдо знать эти тонкости мне пока не понадобилось ни разу. Правда, скрипты я пишу редко, поскольку систематически программирование на шелле никогда не изучал. Соответственно, первые скрипты писались просто копированием рабочих примеров и кусков чужого кода без его реального понимания. Последнее время я больше увлёкся скриптописанием (появлись задачи, где без этого никак), но пробелы всё равно сказываются.


Да вроде базовые функции типа allow_in и allow_out универсальны, поэтому ничего править в них не придётся.

У вас какая-то логическая петля выходит: если функции статичны, то они ненужны, т.к. ненужна автоматизация, надо просто статикой написать все тысячи десятки правил iptables; а если функции не статичны, то они тоже ненужны, потому что их придётся править, и я забуду, как там и что. Т.е. функции ненужны в любом случае — так что ли?


Сейчас бы я так оголтело против неё (выч.-стойкой) не выступал. Сначала вы у меня сформировали мнение, что ничего там доказать строго нельзя, а остаются лишь математикоподобные спекуляции той или иной степени убедительности. Конечно, если так, это было бы слишком плохо. Однако, к счастью, это не так. Я вам на это указал уже позже, причём тогда, когда получил некий бэкграунд из других источников и от других людей — речь о том, что вычислительно-стойкое крипто — это применение [или раздел] теории сложности [complexity theory]. Вы на это отреагировали очень вяло и с недоверием, хотя позже как-то пустили это внутрь себя и даже стали местами на это ссылаться. У Голдрайха, который написал серьёзную толстую книжку на эту тему, есть даже замечательная цитата на этот счёт:

I[link32]ndeed, modern cryptography is strongly coupled with Complexity Theory (in contrast to "classical" cryptography, which is strongly related to information theory).

Вы на это отреагировали молча, так что не знаю, что вы думаете. Может, вы и есть Голдрайх? ☺


Ну да, и я считаю, что это правильный подход.


Что является более базовым, чем теория множеств и логика?


Ну почему, я признаю ваше существование и оперирую как-то с вами. ☺


Это хорошее, ёмкое замечание, не подумал об этом. С точки зрения математики (см. [2][link33], [3][link34] и дальнешие комментарии в том треде) существование чего-либо имеется только в смысле непротиворечивости. Т.е. нет никаких иных препонов знанию, помимо его логической консистентности, но и на последнюю ставятся ограничения по Гёделю. Как яркий пример, мы получаем множество объектов, которые существуют в рамках математики, но вроде как не могут существовать в реальности (полное упорядочение любого множества, парадокс Банаха-Тарского и др.). Почему так правильно — по ссылкам есть ответ. В конечном счёте даже иррациональных чисел «не существует» в обыденном смысле — это нами придуманные идеализации.

Существует ли непознаваемое? Тут опять по Гёделю появляется ответ: какая бы ни была математика, мы можем поставить в ней такой вопрос, ответить на который в рамках этой математики будет нельзя. Простейший изящный пример, понятный любому младшекласснику — это вопрос принадлежнсти точки канторову множеству. На него можно дать ответ, если вы обладаете бесконечным количеством вычислительных ресурсов, но нельзя, если вы обладаете конечным (причём сколь угодно большим). Другие замечательные примеры непознаваемого — это, конечно же, «undecidable problems»[link35] с их конкретным примером «halting problem»[link36].

Казалось бы, это всё вода на вашу мельницу, чтобы заявить, что непознаваемое существует, но если поразбираться, откуда взялась математика и модели в ней, ответ будет не таким однозначным. Пока всё завязано на модели и идеализацию конструктива [4][link37], всё так, а вдруг потом научаться завязываться на сам конструктив так, чтобы парадоксальные вопросы и неразрешимые проблемы отпали сами собой? Например, логические парадоксы как-то же решили, заменив наивную теорию множеств более состоятельной.


Не думаю. Скорей всего, вы просто очень плохо меня знаете, поэтому экстраполируете свой случай на мой. Опять же, вдаваться в подробности, почему та или иная мера/контрмера оправдана в моём случае, но не оправдана в вашем — оффтоп[link29].


Если вы понимаете теорию, то можете немного подумать и доказать любое утверждение. Это не означает, что вы знаете или помните доказательство. Это означает, что вы можете его придумать на лету исходя из уже имеющихся знаний. Возможно, это будет какое-то новое и пока мало кому известное доказательство. Так вот, концептуально нагруженное программирование — такие же доказательства, теоремы и абстракции: иногда проще, исходя из своего понимания, доказать самому, чем разобраться со всеми шагами в чужой логике. Наверно, все сталкивались с этим, когда в доказательстве есть много технических рутинных (но понятных) вычислений — их проще произвести самому, а потом свериться с ответом, чем пошагово за автором делать и сверять промежуточные стадии в расчётах.


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


Это смотря что вы называете «образцово-концептуальной вещью». Впрочем, смысл понятен, и я даже с ним во многом согласен. Просто реальный мир сложен, и моделировать его тяжело, причём там много именно технической сложности, а не концептуальной. Как уже говорилось, один тип сложности не сконвертировать в другой [5][link38].


Кстати, в экспертных сообществах это нонсенс. Например, вы не можете быть немногословным в плане результативных публикаций и при этом судить работы на принятие их на CRYPTO или в FOCS. Т.е. ваша «власть» (слово неправильное, но лень искать более удачный синоним) над сообществом пропорциональна вашей отдаче в это сообщество, нет никаких «почётных членов» и прочих «заслуженных» как в советской системе. Это одна из причин, из-за которых я местные порядки [6][link39] плохо понимаю.
— SATtva (26/02/2015 22:36)   

Тогда сразу ИИ, чего уж.
— SATtva (02/05/2015 11:44, исправлен 02/05/2015 11:44)   

Любителям и профессионалам скриптомесева: ShellCheck[link40].


ShellCheck is a static analysis and linting tool for sh/bash scripts. It's mainly focused on handling typical beginner and intermediate level syntax errors and pitfalls where the shell just gives a cryptic error message or strange behavior, but it also reports on a few more advanced issues where corner cases can cause delayed failures.
Гость (02/05/2015 12:24)   
Спасибо! Прогнал скрипт[link2], вроде ничего серьёзного не нашлось. Часть ошибок он показывает, потому что декларации в разных файлах, а сливать всё в один смысла нет. Двойные кавычки — в принципе, правильное замечание, но все переменные внутренние, я их с пробелами никогда не стал бы делать. Впрочем, ради подстраховки, наверно, стоит писать кавычки. Претензии к ненужности cat, как и к устаревшей форме `cmd`, скорее косметические, но можно исправить. Претензия к
local our_user=$(eval echo "\$$#")
наверно, единственная более-менее серьёзная. Там пишется, что

D[link41]eclare and assign separately to avoid masking return values.

Видимо, если в строке вызова функции будет ошибка, может нечайно прописаться не то. Впрочем, в вызове функции любая ошибка может быть фатальной...

Ссылки
[link1] http://www.pgpru.com/chernowiki/rukovodstva/administrirovanie/policybasedfiljtracijaiptables

[link2] http://www.pgpru.com/chernowiki/rukovodstva/administrirovanie/policybasedfiljtracijaiptables/pf2iptableskonverter

[link3] http://www.pgpru.com/comment80767

[link4] http://www.pgpru.com/comment73746

[link5] http://www.pgpru.com/comment88380

[link6] http://www.pgpru.com/comment78779

[link7] http://www.pgpru.com/biblioteka/rukovodstva/setevajaanonimnostj/prodvinutoeispoljzovanietorvunix/razdeljnoeispoljzovanietorbrowserssistemnymtoriprozrachnajatorifikacija

[link8] http://www.pgpru.com/comment80362

[link9] http://www.pgpru.com/comment87977

[link10] http://www.pgpru.com/comment73719

[link11] http://www.pgpru.com/comment75989

[link12] http://www.pgpru.com/forum/prakticheskajabezopasnostj/anonsideiapparatnogoskremblera

[link13] https://www.pgpru.com/comment75989

[link14] http://www.pgpru.com/comment75999

[link15] http://www.pgpru.com/comment88310

[link16] http://www.pgpru.com/comment82920

[link17] http://www.pgpru.com/comment88487

[link18] https://lurkmore.to/Индусский_код#K.D0.B8.D1.82.D0.B0.D0.B9.D1.81.D0.BA.D0.B8.D0.B9_.D0.BA.D0.BE.D0.B4

[link19] http://www.pgpru.com/comment85869

[link20] http://www.pgpru.com/comment39878

[link21] http://www.pgpru.com/comment85730

[link22] http://www.opennet.ru/opennews/art.shtml?num=41680

[link23] https://en.wikipedia.org/wiki/Domain-specific_language#Advantages_and_disadvantages

[link24] https://en.wikipedia.org/wiki/Domain-specific_language#Unix_shell_scripts

[link25] https://en.wikipedia.org/wiki/Metaprogramming

[link26] https://trac.torproject.org/projects/tor/ticket/14630

[link27] http://www.pgpru.com/comment88653

[link28] http://www.pgpru.com/comment68936

[link29] http://www.pgpru.com/biblioteka/osnovy/fondpoleznyhpostov/raznoe#fppF1II

[link30] http://www.pgpru.com/comment73064

[link31] http://www.pgpru.com/comment65657

[link32] http://www.pgpru.com/comment75500

[link33] http://www.pgpru.com/comment32936

[link34] http://www.pgpru.com/comment32939

[link35] https://en.wikipedia.org/wiki/Undecidable_problem

[link36] https://en.wikipedia.org/wiki/Halting_problem

[link37] http://www.pgpru.com/comment32946

[link38] http://www.pgpru.com/comment48979

[link39] http://www.pgpru.com/comment54118

[link40] http://www.shellcheck.net/

[link41] https://github.com/koalaman/shellcheck/wiki/SC2155