LINUX.ORG.RU

Сеть IP — когда писать программы лень

 


2

6

Автор этой статьи рассуждает о некоторых способах создания прикладных TCP/IP серверов, крайне редко, к сожалению, используемых в прикладном программировании, которые почти не требуют написания программного кода. Поводом для появления этих коротких заметок явилось намерение напомнить о том, что иногда для того, чтобы описать в программе нечто, по существу своему являющееся достаточно сложным, могут существовать способы выразить эти же вещи намного проще.

>>> Подробности

★★★

Проверено: Shaman007 ()
Последнее исправление: Silent (всего исправлений: 1)
Ответ на: Jaaa... Jaaa... от anonymous

С какими этим всеми? Виртуалки на xen - совершенно другой уровень качества чем шареды с миллионом быдлокодеров на хост. Свой print hello world можете хоть на домашнем серваке хостить, от мира не убудет если он навернется.

farafonoff ★★
()
Ответ на: комментарий от Casus

На самом деле fork не дает ни стабильности ни безопасности. Если удаленный злодей может положить сервер(или процесс сервера) запросом, то он вызовет отказ в обслуживании независимо от потоков/нитей. Если можно сэкономить в 5 раз ресурсов - надо это делать.

farafonoff ★★
()
Ответ на: комментарий от A-234

Это поддерживает все необходимое для управления/мониторинга службой. http://www.sensi.org/~alec/unix/redhat/sysvinit.html - в линуксе ничуть не проще, но все равно менее функционально (не поддерживает мониторинг).

farafonoff ★★
()
Ответ на: комментарий от A-234

Нет. Не так.

Не является popen заменой fork/exec, разве что вы мне расскажете как узнать pid порожденного процесса.

Он работает как замена пары fork/exec не в чистом виде. И pid порождённого процесса узнать можно по-разному (вариант навскидку — прочесть /var/run/somefile.pid). Если нужен именно PID, а так-то у нас есть файловый дескриптор, который мы потом в pclose( fd ); закрываем.

Во-первых, при popen() используется для создания канала pipe(), далее форкает, dup'ит файловый дескриптор потомка в созданный pipe, потом только выполняет exec(), процесс-родитель читает pipe и ожидает завершения потомка с каким-либо статусом. В конце закрывает через pclose() фаловый дескриптор потомка.

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

В третьих,

запускать один шелл из под другого да еще с такими ограничениями

Про какие-то суперограничения я не в курсе. Шелл и есть шелл. Ну да, пользовательский, но это не мешает ни кому. С другой стороны — те же конвейеры, то же перенапраление stdin/stderr работает. Удобно.

В четвёртых.

P.S. Еще один момент - stdout вы прочитаете, а как быть с stderr?

Как обычно. У нас же есть шелл — выполняем просто «command-name 2>&1».

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

Нет. :)

Он может сообщать об ошибках запуска, автоматически перезапускаться, автоматически работать от нужного пользователя.

Сервис под оффтоп не круче. Там круче (не это не значит надёжнее) SCM — Service Control Manager, который и рулит всем этим перечисленным.

В линуксе для этого пишется куча кода на множестве языков программирования (init/init scripts)

Нууу... :) Если инит-скрипты это сложно, то... Я молчу. :)))

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

Эммм...

С какими этим всеми?

Ну теми, софт для которых и писался и пишется. Надеюсь, Вы не думаете что тот же xen от сырости завёлся и его ветром надуло? Кто-то же его пишет... :)

Виртуалки на xen - совершенно другой уровень качества чем шареды с миллионом быдлокодеров на хост.

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

Свой print hello world можете хоть на домашнем серваке хостить, от мира не убудет если он навернется.

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

А для home hosting у меня есть ASUS WL-500 gpv2, там lighttpd, для webdav и прочей мелочёвки его хватает. Всё очень просто делается, минут за 20-30, если с нуля.

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

А зачем?

(не поддерживает мониторинг)

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

anonymous
()
Ответ на: Нет. :) от anonymous

Инит скрипты - это очень сложно. Куча разных техник написания, начиная с /var/run, заканчивая pidof, проверкой сокета. Не позволяют проверять состояние сервиса. (куча «замен» типа upstart или systemd пытаются решать эти проблемы с переменным успехом. И да, scm поддерживает зависимости, отложенную загрузку служб и даже запуск по требованию - предел мечтаний леннарта и недостижимый идеал для остальных систем инициализации.

farafonoff ★★
()
Ответ на: Эммм... от anonymous

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

farafonoff ★★
()
Ответ на: А зачем? от anonymous

Как в sysv init узнать запущен тот или иной демон или нет? ps ax|grep |grep -v grep не предлагать. Как вывести список всех запущенных сервисов и все незапущенных сервисов? В каждом дистре пишется своя убогая приблуда.

farafonoff ★★
()
Ответ на: Эммм... от anonymous

xen вообще не линукс и не юникс, там особое микроядро, написанное специально для виртуализации. А linux там используется просто как dom0.

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

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

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

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

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

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

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

1) Все клиенты падучего сервиса должны уметь терпеть падения, и

2) Падучий сервис должен автоматически перезапускаться

Если это выполняется - не важно падают все клиенты или только один.

farafonoff ★★
()
Ответ на: комментарий от Casus

Проблема форка в линуксе - неизбежный оверкоммит.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define BLSIZE 1024*1024
int main(int argc, char* argv[])
{
        printf("sizeof(void*)=%d\n",sizeof(void*));
        size_t i = 0;
        void* block_ptr;
        do {
                block_ptr = malloc(BLSIZE);
                if (block_ptr==NULL)
                {
                        printf("%d of megabyte blocks allocated\n",i);
                } else
                        memset(block_ptr,0,BLSIZE);
                ++i;
        } while (block_ptr!=NULL);
        return 0;
}

Этот нехитрый код в линуксе выдает

sizeof(void*)=4

Убито

а в винде он успешно завершается и выводит

sizeof(void*)=4

1914 of megabyte blocks allocated

В линуксе еще падает вот такое в dmesg

[657484.411108] smart invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0
[657484.411136] smart cpuset=/ mems_allowed=0
[657484.411156] Pid: 2050, comm: smart Not tainted 2.6.32-41-generic-pae #88-Ubuntu
[657484.411166] Call Trace:
[657484.411257]  [<c01d7314>] oom_kill_process+0xa4/0x2b0
[657484.411268]  [<c01d7989>] ? select_bad_process+0xa9/0xe0
[657484.411277]  [<c01d7a11>] __out_of_memory+0x51/0xa0
[657484.411283]  [<c01d7ab8>] out_of_memory+0x58/0xb0
[657484.411288]  [<c01da3d8>] __alloc_pages_slowpath+0x498/0x4b0
[657484.411294]  [<c01da52a>] __alloc_pages_nodemask+0x13a/0x170
[657484.411305]  [<c01dcaea>] __do_page_cache_readahead+0xea/0x200
[657484.411311]  [<c01dcc26>] ra_submit+0x26/0x30
[657484.411316]  [<c01d5d8c>] filemap_fault+0x3dc/0x410
[657484.411333]  [<c01f07ac>] __do_fault+0x4c/0x520
[657484.411350]  [<c013127c>] ? pvclock_clocksource_read+0xfc/0x160
[657484.411356]  [<c01f1cf8>] handle_mm_fault+0x198/0x4a0
[657484.411374]  [<c02238e0>] ? poll_select_copy_remaining+0xb0/0x110
[657484.411405]  [<c05ba38d>] do_page_fault+0x10d/0x3a0
[657484.411411]  [<c0224eb2>] ? sys_select+0x42/0xc0
[657484.411416]  [<c05ba280>] ? do_page_fault+0x0/0x3a0
[657484.411421]  [<c05b8243>] error_code+0x73/0x80
[657484.411429] Mem-Info:
[657484.411439] DMA per-cpu:
[657484.411443] CPU    0: hi:    0, btch:   1 usd:   0
[657484.411450] Normal per-cpu:
[657484.411453] CPU    0: hi:  186, btch:  31 usd:  61
[657484.411460] active_anon:45515 inactive_anon:44547 isolated_anon:0
[657484.411462]  active_file:0 inactive_file:19 isolated_file:0
[657484.411464]  unevictable:8 dirty:0 writeback:5 unstable:0
[657484.411466]  free:961 slab_reclaimable:613 slab_unreclaimable:1243
[657484.411467]  mapped:3 shmem:0 pagetables:825 bounce:0
[657484.411481] DMA free:1556kB min:100kB low:124kB high:148kB active_anon:3216kB inactive_anon:3264kB active_file:0kB inactive_file:16kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15852kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:4kB slab_unreclaimable:8kB kernel_stack:0kB pagetables:12kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no
[657484.411490] lowmem_reserve[]: 0 365 365 365
[657484.411512] Normal free:2288kB min:2392kB low:2988kB high:3588kB active_anon:178844kB inactive_anon:174924kB active_file:0kB inactive_file:60kB unevictable:32kB isolated(anon):0kB isolated(file):0kB present:373876kB mlocked:32kB dirty:0kB writeback:20kB mapped:12kB shmem:0kB slab_reclaimable:2448kB slab_unreclaimable:4964kB kernel_stack:1432kB pagetables:3288kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:47 all_unreclaimable? no
[657484.411539] lowmem_reserve[]: 0 0 0 0
[657484.411548] DMA: 1*4kB 0*8kB 1*16kB 0*32kB 0*64kB 0*128kB 2*256kB 0*512kB 1*1024kB 0*2048kB 0*4096kB = 1556kB
[657484.411561] Normal: 54*4kB 17*8kB 5*16kB 8*32kB 1*64kB 2*128kB 1*256kB 0*512kB 1*1024kB 0*2048kB 0*4096kB = 2288kB
[657484.411581] 2919 total pagecache pages
[657484.411587] 2894 pages in swap cache
[657484.411594] Swap cache stats: add 430176, delete 427282, find 17217/20577
[657484.411597] Free swap  = 0kB
[657484.411599] Total swap = 905208kB
[657484.413710] 98301 pages RAM
[657484.413717] 0 pages HighMem
[657484.413719] 3420 pages reserved
[657484.413725] 54 pages shared
[657484.413727] 93661 pages non-shared
[657484.413731] Out of memory: kill process 19800 (a.out) score 255605 or a child
[657484.430034] Killed process 19800 (a.out)

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

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

/proc/sys/vm/overcommit_memory
              This file contains the kernel virtual memory accounting mode.  Values
              are:

                     0: heuristic overcommit (this is the default)
                     1: always overcommit, never check
                     2: always check, never overcommit

              In mode 0, calls of mmap(2) with MAP_NORESERVE are not checked, and the
              default check is very weak, leading to the risk of getting a process
              "OOM-killed".  Under Linux 2.4 any nonzero value implies mode 1.  In
              mode 2 (available since Linux 2.6), the total virtual address space on
              the system is limited to (SS + RAM*(r/100)), where SS is the size of
              the swap space, and RAM is the size of the physical memory, and r is
              the contents of the file /proc/sys/vm/overcommit_ratio.

       /proc/sys/vm/overcommit_ratio
              See the description of /proc/sys/vm/overcommit_memory.
То, что винда никогда не оверкоммитит, это спорное преимущество, поскольку может влиять на performance. В линуксе можно и так и этак.

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

В линуксе использование fork() практически обязывает использовать оверкоммит. Вот у меня на серваке крутится демон, который сначала маллочит 2 гига памяти, а потом форкается 8 раз. Без оверкоммита это 16 гиг памяти, но реально они никогда не занимаются. И да, этот тест на винде проходит быстрее чем на линуксе в разы.

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

Мне проще...

upstart или systemd

А давайте попроще?

Не позволяют проверять состояние сервиса.

/etc/init.d/daemon status ?

scm поддерживает зависимости

/etc/init.d/daemon ineed — кто нужен мне, /etc/init.d/daemon needsme — кому нужен я. /etc/init.d/daemon broken — кто нужен, но кого по какой-то причине нет...

Инит скрипты - это очень сложно.

#!/sbin/runscript
depend() {
  Зависимости.
}

start() {
  Команды, необходимые для запуска демона. Единственный обязательный раздел.
}

stop() {
  Остановка.
}

restart() {
  Перезапуск.
}

Что тут сложного? А! Да! Я — гентарь и (что совсем крамольно) нахожу GNOME 3 & GNOME Shell удобным...

/* Если кому-то полегчает, то могу даже добавить что я — «тролль, лжец и девственник». :) */

отложенную загрузку служб

Команду at или crone (более «широкий» вариант) не отменили... Впрочем, если честно, то не помню когда мне в последний раз требовалось что-то типа отложенной загрузки.

даже запуск по требованию

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

Куча разных техник написания

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

Если кому-то не понравится моя отсылка к Gentoo/Hardened Gentoo, то я сразу замечу что чего только люди не придумают чтобы не пользоваться Gentoo... И не писать на С. :)

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

Да ни какой разницы...

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

Я не хочу сильно углубляться в данную тематику в силу ряда причин, но здесь проблема в большей степени связана с уязвимостью самого сервера. И не важно какой он именно. Да и даже сейчас если я случайно стану членом вашего домена, то с очень высокой вероятностью я поимею вашу сеть в общем и целом. А вот идея виртуальные хосты (неважно — IP-based или name-based) для сервера слегка менее напряжны чем туча виртуальных машин. Хотя бы потому что это адское поделие — похапе будет не для каждой отдельной вирт. машины, а для всех хостов в общем и целом. Кроме того, есть шанс вырваться и за пределы вирт. машин (то же обсуждать не буду, уж простите :) ). Так что, с примером я лично не согласен. :)

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

Почему не предлагать?

ps ax|grep |grep -v grep не предлагать.

В скрипте это очень удобно делать. Вот уж что точно не предлагать, так это WMI. Ибо окромя задач администрирования в отличие от того же bash оно больше на фиг не нужно (и не умеет ни чего).

Как вывести список всех запущенных сервисов и все незапущенных сервисов?

Что означает «незапущеный сервис»? Зачем он на данной машине? 8/

В каждом дистре пишется своя убогая приблуда.

В оном дистре оффтопа приблуда не менее убогая. Но это же не мешает? :) Я гентарь, у меня всё хорошо. Я всем доволен. :)

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

Да, я в курсе...

xen вообще не линукс и не юникс, там особое микроядро, написанное специально для виртуализации. А linux там используется просто как dom0.

Угу. Отчасти верно. Но вот проблема в том, что toolstack-то ни кто не отменял, а он вовсе не в микроядре и питон по большей части. В dom0 то же может дофига чего крутиться. Да и потом — для задачи выделения/освобождения ресурсов (например, той же памяти) совершенно пофигу как именно выделяются/освобождаются ресурсы. Алгоритмы одинаковы, реализации и проблемы этих реализаций примерно везде одинаковы — от «чего-то забрали, да не вернули» и до откровенных дырьев. А вот уж как именно там та же память — через malloc()/free(), али ещё как — не особо важно. Так что... всё как обычно. Те же яйца, вид сбоку. :)

и ваш асус ляжет под нагрузкой и будет лежать пока не сгорит от перегрева

Во-первых, великих ратных подвигов от Broadcom BCM5354KFBG ни кто и не ожидал и не ожидает. Во-вторых, проблема как положить любой вебсервер давным-давно исследована и число соединений выставлено таким, чтобы не было ненужного расхода ресурсов или нагрева ;) . Например, если у Вас есть толпа клиентов, работающих по GPRS, то весьма вероятно что Вам может небо с овчинку показаться и не важно — виртуализировано ли всё или просто на вирт. хостах висит. ;) В третьих, там нет php, хотя поставить можно, но я не апологет... «этого». Всё хорошо, не волнуйтесь. :)

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

А я бы не стал...

1) Все клиенты падучего сервиса должны уметь терпеть падения, и

... выдумывать. Это не проблема. Как правило, разумно написанный клиент спокойно переживёт ситуацию падения сервера. А, если сервера дублированы, то ему (клиенту) вообще всё по-фигу.

2) Падучий сервис должен автоматически перезапускаться

... вот этого делать. По причине того, что если Ваш демон упал, то упал он явно неспроста. Это уже материал для служебного расследования. И, вдобавок, решиться в продакшоне на такое поведение демона я бы отважился только под Hardened Gentoo с её ssp, pax, selinux и прочими доп. защитами — в частности с fPIC и динамическим изменение адреса загрузки кода программ и библиотек. Потому что если кто-то подбирается к Вашему хосту/хостам/сети, то лучше бы чтобы он подбирался подольше. ;)

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

Не-а... :)

Проблема форка в линуксе - неизбежный оверкоммит.

Это не проблема fork(), не проблема linux. Это прежде всего проблема программиста, который допускает выделение памяти явно не понимая зачем именно она ему нужна. Он же её всё-равно не использует... При грамотном подходе память достаточно быстро возвращается системе.

а в винде он успешно завершается и выводит

А подольше подождать? Вообще-то, уважаемый Casus уже дал ответ... Но я только могу добавить что oom_killer (см. комментарии в коде /usr/src/linux-3.3.4-gentoo/mm/oom_kill.c) начнёт свою работу _почти_ при полном исчерпании вирт. памяти (можно почитать как именно он работает, не в том суть). Вирт. память это RAM+swap. В linux раздел swap это отдельный раздел (в принципе, можно и в файл свопиться) а в винде — это спец. файл в пределах файловой системы. Отсюда совет — просто подождите по-дольше. Но только я за работоспособность оффтопа не ручаюсь в конце эксперимента.

anonymous
()
Ответ на: Мне проще... от anonymous

Все отлично. Напиши реализации status и broken.

superserver:/etc/init.d# /etc/init.d/xinetd status Usage: /etc/init.d/xinetd {start|stop|reload|force-reload|restart} superserver:/etc/init.d# /etc/init.d/rsync Display all 113 possibilities? (y or n) superserver:/etc/init.d# /etc/init.d/rsync status Usage: /etc/init.d/rsync {start|stop|reload|force-reload|restart}

Не все init.d скрипты в моем дебианчике это поддерживают.

Отложенная загрузка - это когда после ГУИ. пока я вбиваю пароль на десктопе можно еще кучу всего догрузить.

Запуск по необходимости.... Пишем скрипт подключения к интернету, в нем предлагаешь писать /etc/init.d.... start для всего что он может использьвать? Или все-таки виндовая реализация которая стартует службу rras при подключении к интернету удобнее?

Писать 50-100 разных программ которые делают ровно одно и тоже - бред. Вынесение общего кода в SCM - очень разумный подход, вот только любители писать bash скрипты этого не понимают.

farafonoff ★★
()
Ответ на: Да ни какой разницы... от anonymous

Защитить виртуальную машину (написав надежное микроядро с бинарником в 500Кб) намного проще, чем защитить apache+php на много мегабайт бинарников, которые работают под рутом и постоянно понижают свои права до каждого пользователя. Даже в ядре linux постоянно находят локальные эксплойты. Собери любой и поимей весь шаред хостинг.

farafonoff ★★
()
Ответ на: А я бы не стал... от anonymous

Покрутите в продакшне asterisk. падает постоянно и сам по себе. Доступа извне нету, так что злоумышленники исключены, но все равно падает. Иначе как перезапускать вариантов нету. Падает оно не спроста, а потому что говнорукие люди не умеют писать на С, но заменить их паделие нечем.

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

И... Зачем?!?

Напиши реализации status и broken.

status выводит только started или stopped. А broken опосля energe --depclean; revdep-rebuild не выводит ни чего, т.к., всё старьё было удалено и все зависимости проверены. Следовательно, выводить ему нечего (если по-хорошему).

Не все init.d скрипты в моем дебианчике это поддерживают.

Какие-то поддерживают, а какие-то нет? Ну... Уже лучше.

Отложенная загрузка - это когда после ГУИ. пока я вбиваю пароль на десктопе можно еще кучу всего догрузить.

У меня xdm (внутри него gdm, но это мелочи), грузится опосля всего. Впрочем, по-моему, init-ng позволял какие-то трюки с загрузкой делать, но я им давно уже не пользуюсь. Всё грузится быстро. И к моменту ввода пароля, всё прогружено и готово.

Пишем скрипт подключения к интернету, в нем предлагаешь писать /etc/init.d.... start для всего что он может использьвать?

Если про службу RRAS, то подразумевается PPTP? Вот как это делается в Gentoo — http://en.gentoo-wiki.com/wiki/PPTP. Там, внизу, есть про net.ppp0. При загрузке (если сделать rc-update add net.ppp0 default), то соединение произойдёт автоматом. Ну, или вручную, при /etc/init.d/net.ppp0 start.

RRAS в разы неудобнее! /* Я это гарантирую! :))) */

Если хочется настроек через gtk (например), то есть какая-то «звонилка», я ей не польлзуюсь, так что сказать что это именно не могу.

Писать 50-100 разных программ которые делают ровно одно и тоже - бред. Вынесение общего кода в SCM - очень разумный подход, вот только любители писать bash скрипты этого не понимают.

Не. А вот со скриптами (и bash-скриптами) у Вас, милейший, уж простите великодушно, но ни как. Ровным счётом ни как. Дело в том, что bash-скрипты от «нормального» С-кода (например) отличаются только тем, что они работают через шелл. Но можно делать что-то типа библиотек, где собирать нужные функции. Короче, настолько много чего умеет, что ажно виндарасы с оффтопа 2k начали помаленечку добавлять самопальный шелл в свою систему. Вначале только для конфигурирования/управления, сейчас вот набор расширили. Лет так через нцать окончательно оюниксеют. И будут расписывать какой шеллистый изо всех шеллов их шелл... :))) Ну и да... Хотел бы я глянуть на то, как ты с мышой в руках и на боевом взводе уделаешь связку bash + ssh + coreutils. :)))

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

Неспроста.

Падает оно не спроста, а потому что говнорукие люди не умеют писать на С, но заменить их паделие нечем.

Надо бы посмотреть что там в составе астериска и как собрано... Он у меня заместо офисной АТС, вроде как ни чего. Только при работе извне, надо на файерволле попытки аутентификации со стороны внешних extension'ов поставить более осмысленные. С задержкой в пару-тройку минут. Этого хватит. Ну и пароли посмотреть на слабые...

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

О как!

написав надежное микроядро с бинарником в 500Кб) намного проще

И что? Будет работать только микроядро? А нафиг оно тогда? Если там окромя микроядра нет ни чего?

apache+php на много мегабайт бинарников

Т.е., микроядро их целиком и полностью заменит? О как! :) Резко подрываюсь ставить-ставить-ставить... :)

Защитить виртуальную машину

В которой крутится тот же апач+похапе? Всё. Уже можно не защищать...

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

В апаче только один процесс рутовый (как правило). И он не взаимодействует с пользователями, этим занимаются его потомки. В крайнем случае можно запустить апач на порту 8080 (например) и на файерволле поставить перенаправление 80 <-> 8080. Тогда Апача можно запустить и не из-под рута.

Даже в ядре linux постоянно находят локальные эксплойты.

У нас (и у меня и у моих коллег) есть одно правило — «весь код уязвим». Либо напрямую, либо через используемые библиотеки. Не факт что то, что не видно сейчас не всплывёт завтра. И что, не жить? Миф о супер-защищённости виртуальных машин это то же миф... ;)

Собери любой и поимей весь шаред хостинг.

Тут надо заметить — «поимей что угодно». Шаред хостинг — одно и частное приложение. Ни чего страшного... Use a Hardened Gentoo, Luke... :) Поиметь будет посложнее.

anonymous
()
Ответ на: И... Зачем?!? от anonymous

А ты мне напиши их. Посмотрим насколько простой код у тебя получится.

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

RRAS это еще и dialup/pppoe/pptp/l2tp. Стабильный _одинаковый_ от винды к винде поднимать любые удаленные соединения. Судя по вашей ссылке, настройка сети может отличаться даже между инсталляциями одной генты.

Библиотеки? функции? Это точно про bash? Шелл в винде всегда был, а вот над попытками сделать SCM в виде upstart/systemd/что-там в федоре было в редмонде наверное потешаются.

farafonoff ★★
()
Ответ на: О как! от anonymous

микроядро изолирует виртуалки друг от друга. Сломают одну - остальные в безопасности. Уязвимости в xen - дело единичное, и те в основном в гостевых ядрах. Если знаешь действующие дырки - вперед, amazon ждет тебя.

Hardened gentoo не панацея. Майкрософт уже много лет используют все эти техники, но их успешно обходят вирусописатели. Ради 1,5 инсталляций hardened gentoo просто никто не хочет возиться.

farafonoff ★★
()
Ответ на: Неспроста. от anonymous

Оставь почту :) Когда в следующий раз помрет, кину тебе коредамп :) Какая нагрузка на твоей офисной атс? У нас до 50к звонков в сутки/100 звонков одновременно.

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

Asterisk

Какая нагрузка на твоей офисной атс? У нас до 50к звонков в сутки/100 звонков одновременно.

Скажу честно — у меня порядка 450 extensions, одновременность звонков и общее их число не смотрел. Вроде, всё работает, чего туда лезьть лишний раз? Ну и само собой — с выходом на ТфОП (PSTN, на «город» и «межгород», короче). Через внешний гейт.

На машинке, на которой всё это крутится 2Gb RAM, правда, там больше нет ни чего. Только Asterisk...

Когда в следующий раз помрет, кину тебе коредамп

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

Ну и вывод free -m, на него бы полюбопытствовать...

Оставь почту

Не вопрос — egfrv34 на gмыле ком...

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

Не-не-не...

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

Уязвимостей в прикладном коде (я имею ввиду не ядро) всегда больше. И до них достучатьсмя куда как проще. А вот уж что там дальше... Не сильно важно. Ну и если стоит один и тот же софт в разных ВМ, то какая разница сколько их? Поиметь-то можно все и по очереди... Так что, вся эта беда крайне относительна.

Уязвимости в xen - дело единичное, и те в основном в гостевых ядрах.

Ну да... Так все всё и рассказали... Впрочем, давай к тексту. ;) Следи за руками... http://www.securityfocus.com/bid/47779/info Давай проанализируем немножечко? В «дискушоне» (там же) написано:

Successfully exploiting these issues may allow attackers to execute arbitrary code within the context of the privileged domain (Dom0).

В сплоите (там же) написано:

Currently we are not aware of any working exploits.

Ну, может, у вас его (рабочего сплоита) и нет, но снилось мне что его нет у меня? Или у кого-то ещё? Откуда такая уверенность? Публиковать сплоит? А на фига мне (предположим) это надо? А ведь это Dom0! Ну вот и прикинь теперь — зачем мне приглашение на амазон, может оно несколько подустарело?

/* Кстати, я дал почту и тут светится IP-адрес. Прошу не сильно напрягаться. Доступ к почте — только через Тор, здесь я так же сижу через exit node на хорошем канале. */

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

А вот тут просто адский напалм... :)))

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

Не-не-не... Давай не будем добавлять в дискуссию «маркетинг»? Изо всего того, что предлагает Hardened Gentoo, аналогом у M$ является только Guard Stack. Ключик /GS в DevStudio или как там это сейчас именуют.

В Харденед это ssp:

... SSP or stack smashing protection. SSP protects against stack smashing by allocating an area outside of buffers and putting a random, cryptographic canary (or marker) in it. This allows SSP to check whether the canary was overwritten after any write to the buffer and allows it to kill the app if it was overwritten. The hardened toolchain gives users a PIE/SSP userland the easiest possible way.

Что там при выставленном /GS делается я на память не помню, но прочесть можно здесь — http://msdn.microsoft.com/en-us/library/8dbf701c(v=vs.80).aspx

В M$ нет патчей от АНБ (NSA) — SELinux, нет PIE, короче... Чтоб мне тут долго не расписывать чего там есть, читать здесь — http://www.gentoo.org/proj/en/hardened/

«Обходить» в M$ нечего.

Ради 1,5 инсталляций hardened gentoo просто никто не хочет возиться.

Их несколько больше... Просто, пендосы отрыли себе нехилый оборонительный такой рубеж и помалкивают. В ex-USSR «особоумные» всё пляшут на граблях виндов, убеждая себя и друг-друга в том, что это «промышленный стандарт». Ага... Промышленный стандарт в дурдоме... :)))

anonymous
()
Ответ на: Не-а... :) от anonymous

винде — это спец. файл в пределах файловой системы

Как этот факт может создать какие-то проблемы при запуске этой программы?

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

А с чего Вы взяли?

Как этот факт может создать какие-то проблемы при запуске этой программы?

Что факт того, что файл подкачки в винде размещён в стандартном дисковом пространстве создаст какие-то проблемы? При _запуске_?

Вот при работе вполне может. Если малость подождать, то со временем этот файл сможет занять оооочень большой объём диска. Дело в том, что этот файл как правило, является динамическим по своему размеру. Оффтоп использует собственные «умолчания», а юзер об этом как правило не в курсе. Если я не ошибаюсь, то минимальный размер своп-файла по умолчанию равен 1.5*RAM, но верхний предел по-моему, то ли 16, то ли 32TB. Программа будет мало-помалу отжирать «память», но уже из рабочего пространства диска.

Во-первых, не ясно что будет в случае аварийного завершения такой программы, и как память будет возвращена, во-вторых, начнётся фрагментация такого своп-файла (в дефрагментаторе ХР такие фрагменты показывались зелёным цветом, если помните и ни куда не переносились).

Гораздо лучше ограничить принудительно размер своп-файла (где-то в настройках это есть). В этом случае оффтоп разместит файл с минимальной фрагментацией. Но тогда получится ограничение по размеру виртуальной памяти. И чем это лучше Linux? А! Да! Ещё можно вынести такой файл на отдельный раздел. Но тогда это совсем не лучше Linux.

anonymous
()
Ответ на: А с чего Вы взяли? от anonymous

этот файл как правило, является динамическим по своему размеру

точно, совсем забыл про это... если приходится пользоваться виндой, всегда настраиваю определённый размер

unC0Rr ★★★★★
()
Ответ на: Не-не-не... от anonymous

Эксплойта нету, баге уже целый год, апдейты есть. Верх паранойности - разместить каждую службу в своей вм (мы примерно так и делаем) +иптаблес закрывает их друг от друга.

farafonoff ★★
()
Ответ на: Не-а... :) от anonymous

Что значит подождать подольше? Я привел код, программа успешно выполнилась и завершилась с кодом 0. После этого система была полностью работоспособна, правда чуть замедлилась (из-за сброса дискового кэша).

Что значит проблема в программистах?

10757 www-data  20   0  282M 53968  9340 S  1.0  0.3  0:00.54 /usr/sbin/apache2 -k start
10758 www-data  20   0  282M 53968  9340 S  0.0  0.3  0:00.00 /usr/sbin/apache2 -k start
10814 www-data  20   0  281M 52816  8512 S  0.0  0.3  0:00.18 /usr/sbin/apache2 -k start
10815 www-data  20   0  281M 52816  8512 S  0.0  0.3  0:00.00 /usr/sbin/apache2 -k start
10811 www-data  20   0  332M 42576  8460 S  0.0  0.3  0:00.32 /usr/sbin/apache2 -k start
10812 www-data  20   0  332M 42576  8460 S  0.0  0.3  0:00.00 /usr/sbin/apache2 -k start
29882 root      20   0  258M 26256  5800 S  0.0  0.2  4:10.84 /usr/sbin/apache2 -k start

Апач выделяет НА МНОГО больше памяти чем использует. Это именно архитектурная проблема, потому что overcommit это часть механизма copy on write. Если бы этот апач был с потоками, он бы не требовал оверкоммита, а сейчас он выделил больше памяти, чем есть на хосте.

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

Ну как скажете... :)))

Эксплойта нету

Главное — вера! :)))

апдейты есть

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

А то, что его нет, так его нет в паблике. И ещё лет несколько не будет. Ибо незачем. Ни когда не понимал белых шапочек...

Верх паранойности - разместить каждую службу в своей вм (мы примерно так и делаем)

А ещё лучше — на отдельном хосте (физически, на отдельном сервере). Мы так делаем.

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

Уууу!

ASLR есть (не спасает от эксплойтов)

Это в газенваген за ненадобностью. Это весьма слабое средство в оффтопе, которое только _слегка_ похоже на то, что делается в Hardened. Проверено. Руками.

ACL есть

Access Control Lists? Это про них? Ну, про модель НЕбезопасности офтопа я вообще говорить отказываюсь, т.к. там ни кто не думает о безопасности как о таковой (группа разработчиков Excel, наверное у них главные эксперты). Вы мне скажите — Вы в программном коде (своём) хоть раз пытались использовать _ЭТО_?!? И как оно в сравнении с простой и понятной с полу-пинга системой безопасности из *NIX?

сертификация АНБ есть

Я говорю не о «сертификации». Я говорю о ПАТЧАХ для ядра, которые АНБ предложило сообществу Linux (видать такие добрые). Это называется SELinux. Вот эта подсистема ядра именно ими и создана.

Просто hardened gentoo это 1% от 1%, потому и вирусов пока нету.

Я ещё раз повторю что главное это вера. /* Моё воспалённое сознание рисует мне картину как я (лично) скачиваю из Сети вирь/троян/сплоит для своей православной и сижу его компилю... */

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

Тут всё запущено. И сильно...

Если по-просту, то это просто ... п*ц!!!

Я привел код, программа успешно выполнилась и завершилась с кодом 0.

Во-первых, я не имею оффтопа (в последнее время вообще от него избавлен) чтобы подтвердить или опровергнуть Ваши слова.

В Linux (просто гентушный десктоп) у меня Ваш же код вывел:

noone@nonamehost ~/tests $ ./test
sizeof(void*)=4
3056 of megabyte blocks allocated

В dmesg девственно чисто. ЧЯДНТ?

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

Что значит проблема в программистах?

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

Рекомендую взглянуть на то, что есть у меня:

apache2 -t -D DUMP_MODULES
Вырезана незначащая строка.
Loaded Modules:
 core_module (static)
 mpm_worker_module (static)
 http_module (static)
 so_module (static)
 actions_module (shared)
 authz_host_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 expires_module (shared)
 filter_module (shared)
 mime_module (shared)
Syntax OK

Но вот тут явная проблема в недоадмине. Это кто же там у вас такой «умный», чтобы зарядить Апач с MPM prefork?

Так же рекомендую ознакомиться:

apache2 -V
Server version: Apache/2.2.22 (Unix)
Server built:   Apr 27 2012 01:32:17
Server's Module Magic Number: 20051115:30
Server loaded:  APR 1.4.6, APR-Util 1.4.1
Compiled using: APR 1.4.6, APR-Util 1.4.1
Architecture:   32-bit
Server MPM:     Worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/worker"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/usr"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
 -D SERVER_CONFIG_FILE="/etc/apache2/httpd.conf"

Ну и под завязку небольшой hint...

Choosing an MPM

...

* The worker MPM uses multiple child processes with many threads each. Each thread handles one connection at a time. Worker generally is a good choice for high-traffic servers because it has a smaller memory footprint than the prefork MPM.

* The prefork MPM uses multiple child processes with one thread each. Each process handles one connection at a time. On many systems, prefork is comparable in speed to worker, but it uses more memory. Prefork's threadless design has advantages over worker in some situations: it can be used with non-thread-safe third-party modules, and it is easier to debug on platforms with poor thread debugging support.

Вот всегда улыбает, когда говорят что что-то там плохо работает/тормозит. Может проще — плохо готовим?

Если бы этот апач был с потоками

Сделайте одолжение — расстреляйте админа? :)

overcommit это часть механизма copy on write

Не. Про overcommit... Это Вам рано. Поверьте наслово... :)))

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

Дааа....

Винда сама определяет пределы роста этого файла каким-то образом.

Это такая специальная уличная магия... :)))

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

Бррр...

А ты мне напиши их. Посмотрим насколько простой код у тебя получится.

А мне-то зачем? У меня, если в скрипте что-то указано в ф-ии depend() { ... }, но не присутствует в инит-скриптах, то broken мне об этом скажет.

status так же реализован...

Мейнтейнеры пакета должны руками написать эти скрипты

А кто ещё их напишет? Кто ещё лучше знает что нужно их демону (например)?

RRAS это еще и dialup/pppoe/pptp/l2tp.

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

Судя по вашей ссылке, настройка сети может отличаться даже между инсталляциями одной генты.

Не только сети. В генте модульная система настройки сети. Очень удобно для тех же ноутбуков/нетбуков.

Я даже могу сделать так — http://www.gentoo.org/doc/ru/handbook/handbook-x86.xml?part=2&chap=4 (параграф 4.е). Просто надо отдавать себе отчёт в том, что делаешь.

Библиотеки? функции? Это точно про bash?

Точно. Функции уже в данном треде показаны. А «типа библиотеки» организуются через создание файла с функциями. И путём использования этой «типа библиотеки» через source в теле скрипта.

Шелл в винде всегда был

ЛОЛШТО?!? Это Вы столь смело назвали cmd.exe и .bat/.cmd файлы? Бууугага! :))) Рыдаааааюююю.... :)))

anonymous
()
Ответ на: Уууу! от anonymous

ASLR это и есть ваше PIE. Тем не менее, эксплойты все равно с какой-то вероятностью исполняют произвольный код на уязвимой системе.

SELinux - это тоже ACL, и настраивается ничуть не проще. В *NIX есть 2 системы безопасности - неработающая (8-ричные права) и SELinux, который постоянно рекомендуют отключать :)

Пусть оно нарисует вам, что когда доля линуксов достигнет 20% (эмпирический показатель, посмотрите на Apple), появятся вирусы, использующие 0-day эксплойты. Правда когда надо заменить на если, потому что пока эта планка видится мне недостижимой.

farafonoff ★★
()
Ответ на: Тут всё запущено. И сильно... от anonymous

Очевидно, вы используете >4 гб памяти на 32х разрядной системе.

Так работает апач в пакетной системе дебиана - если поставить php5, автоматически ставится mpm_prefork и сносятся все остальные mpm. Предлагаю вырвать руки у мейнтейнеров пакетов, а заодно и у всего дебиан сообщества.

farafonoff ★★
()
Ответ на: Бррр... от anonymous

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

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

Шелл в винде используется для автоматизации простых действий. В качестве полноценного языка программирования в винде используются другие инструменты (сейчас - .net)

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