Pull to refresh
0
@elsifread⁠-⁠only

User

Send message

Изолируем демоны с systemd или «вам не нужен Docker для этого!»

Reading time9 min
Views50K
В последнее время я вижу, как довольно большое количество людей применяет контейнерную виртуализацию только для того, чтобы запереть потенциально небезопасное приложение внутри контейнера. Как правило, используют для этого Docker из-за его распространенности, и не знают ничего лучше. Действительно, многие демоны первоначально запускаются от имени root, а далее либо понижают свои привилегии, либо master-процесс порождает обрабатывающие процессы с пониженными привилегиями. А есть и такие, которые работают исключительно от root. Если в демоне обнаружат уязвимость, которая позволяет получить доступ с максимальными привилегиями, будет не очень приятно обнаружить злоумышленников, уже успевших скачать все данные и оставить вирусов.
Контейнеризация, предоставляемая Docker и другим подобным ПО, действительно спасает от этой проблемы, но также и привносит новые: необходимо создавать контейнер для каждого демона, заботиться о сохранности измененных файлов, обновлять базовый образ, да и сами контейнеры часто основаны на разных ОС, которые необходимо хранить на диске, хотя они вам, в общем-то, и не особо нужны. Что делать, если вам не нужны контейнеры как таковые, в Docker Hub приложение собрано не так, как нужно вам, да и версия устарела, SELinux и AppArmor кажутся вам слишком сложными, а вам бы хотелось запускать его в вашем окружении, но используя такую же изоляцию, которую использует Docker?

Capabilities

В чем отличие обычного пользователя от root? Почему root может управлять сетью, загружать модули ядра, монтировать файловые системы, убивать процессы любых пользователей, а обычный пользователь лишен таких возможностей? Все дело в capabilities — средстве для управления привилегиями. Все эти привилегии даются пользователю с UID 0 (т.е. root) по умолчанию, а у обычного пользователя нет ни одного из них. Привилегии можно как дать, так и отобрать. Так, например, привычная команда ping требует создания RAW-сокета, что невозможно сделать от имени обычного пользователя. Исторически, на ping ставили SUID-флаг, который просто запускал программу от имени суперпользователя, но сейчас все современные дистрибутивы выставляют CAP_NET_RAW capability, которая позволяет запускать ping из-под любого аккаунта.
Получить список установленных capabilities файла можно командой getcap из состава libcap.
% getcap $(which ping)
/usr/bin/ping = cap_net_raw+ep

Флаг p здесь означает permitted, т.е. у приложения есть возможность использовать заданную capability, e значит effective — приложение будет ее использовать, и есть еще флаг iinheritable, что дает возможность сохранять список capabilities при вызове функции execve().
Capabilities можно задать как на уровне ФС, так и просто у отдельного потока программы. Получить capability, которая не была доступна с момента запуска, нельзя, т.е. привилегии можно только понижать, но не повышать.
Также существуют биты безопасности (Secure Bits), их три: KEEP_CAPS позволяет сохранить capability при вызове setuid, NO_SETUID_FIXUP отключает перенастройку capability при вызове setuid, и NOROOT запрещает выдачу дополнительных привилегий при запуске suid-программ.
Читать дальше →
Total votes 72: ↑70 and ↓2+68
Comments34

Революция у порога или очередная ниша для «людей в теме»?

Reading time4 min
Views11K
Последние годы ознаменованы бурным развитием стартапов всех мастей: от идей «подогрева» человеков СВЧ-излучением (протестировано на живых людях, вот они, все живы-целехоньки) и иже с ними до по истине гениальных. В гонке за венчурными инвестициями многие теряют голову, подчас выдавая желаемое за действительное, сталкиваясь с ранее незаметными камнями в казалось бы чистом денежном потоке. Сегодня поговорим об одном таком гениальном(?) предприятии.
image
Читать дальше →
Total votes 19: ↑5 and ↓14-9
Comments74

Коварный роутер или почему порты надо открывать

Reading time9 min
Views47K

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

Речь об «автоматической» пробросе порта, через технологию UPnP, без использования «стандартной» библиотеки NATUPnPLib.

О том, в силу чего был выбран такой непростой путь и почему он все-таки непростой — читайте ниже.
Подробности эксперимента
Total votes 27: ↑21 and ↓6+15
Comments13

Генераторы непрерывно распределенных случайных величин

Reading time15 min
Views116K
Генератор случайных чисел во многом подобен сексу: когда он хорош — это прекрасно, когда он плох, все равно приятно (Джордж Марсалья, 1984)

Популярность стохастических алгоритмов все растет. Многие из них базируются на генерации большого количества различных случайных величин. Далеко не всегда равномерно распределенных. Здесь я попытался собрать информацию о быстрых и точных генераторах случайных величин с известными распределениями. Задачи могут быть разными, разными могут быть и критерии. Кому-то важно время генерации, кому-то — точность, кому-то — криптоустойчивость, кому-то — скорость сходимости. Лично я исходил из предположения, что мы имеем некий базовый генератор, возвращающий псевдослучайное целое число, равномерно распределенное от 0 до некого RAND_MAX

unsigned long long BasicRandGenerator() {
    unsigned long long randomVariable;
    // some magic here
    ...
    return randomVariable;
}

и что этот генератор достаточно быстрый. Я имею ввиду, что дешевле сгенерировать с десяток случайных чисел, нежели чем посчитать логарифм или возвести в степень одно из них. Это могут быть стандартные генераторы: std::rand(), rand в MATLAB, Java.util.Random и т.д. Но имейте ввиду, что подобные генераторы редко подходят для серьезной работы. Зачастую они проваливают разные статистические тесты. А также, помните, что вы полностью зависите от них и лучше использовать свой собственный генератор, чтобы иметь представление о его работе.

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


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

Равномерное распределение





Читать дальше →
Total votes 44: ↑42 and ↓2+40
Comments7

Про модель, логику, ООП, разработку и остальное

Reading time29 min
Views109K
Часто ли вы задумываетесь – почему что-то сделано так или иначе? Почему у вас микросервисы или монолит, двухзвенка или трехзвенка? Зачем вам многослойная архитектура и сколько у вас вообще слоев? Что такое бизнес-логика, логика приложения, презентационная логика и почему все так разделено? Посмотрите на свое приложение – как оно вообще спроектировано? Что в нем и где находится, почему это сделано именно так?
Потому что так написано в книжках или так говорят авторитетные личности? Какие ВАШИ проблемы решает тот или иной подход/паттерн?
Даже то, что на первый взгляд кажется очевидным, порой бывает очень сложно объяснить. А иногда, в попытке объяснения, приходит понимание того, что очевидные мысли были и вовсе ошибочны.
Давайте попробуем взять какой-нибудь пример и изучить на нем эти вопросы со всех сторон.
Читать дальше →
Total votes 55: ↑51 and ↓4+47
Comments34

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

Reading time35 min
Views32K
Все проблемы в области Computer Science могут быть решены введением дополнительного уровня косвенности. За исключением одной: слишком большого числа уровней косвенности.
All problems in computer science can be solved by another level of indirection, except for the problem of too many layers of indirection.

Программные интерпретаторы известны своей невысокой скоростью работы. В этой статье я расскажу, как их можно ускорить.
Я давно уже хотел поподробней остановиться на создании интерпретаторов. Прямо таки обещал, в том числе самому себе. Однако серьёзный подход требовал использования более-менее реалистичного кода для примеров, а также проведения измерений производительности, подтверждающих (а иногда и опровергающих) мои аргументы. Но наконец-то я готов представить почтенной публике результаты, причём даже чуть более интересные, чем собирался.
В данной статье будет описано семь способов построения программной ВМ для одной гостевой системы. От самых медленных мы проследуем к более быстрым, поочерёдно избавляясь от различных «неэффективностей» в коде, и в конце сравним их работу на примере одной программы.
Тех, кто не боится ассемблерных листингов, испещрённого макросами кода на Си, обильно удобренного адресной арифметикой, goto и даже longjmp, а также программ, использующих копипаст во имя скорости или даже создающих куски самих себя, прошу пожаловать под кат.
Читать дальше →
Total votes 47: ↑47 and ↓0+47
Comments48

Software renderer — 2: растеризация и интерполяция атрибутов

Reading time18 min
Views21K
Привет. В прошлой статье я описал математику, которая необходима для вывода трехмерной сцены на экран в виде сетки — т.е. мы остановились на моменте получения координат вершин в пространстве экрана. Следующий шаг — это «заполнение» полигонов из которых состоит объект, т.е. поиск пикселей, которые входят в изображение объекта на экране. Процесс поиска этих точек называется растеризацией. Мы так же хотим иметь возможность текстурировать и освещать объекты — для этого необходимо уметь интерполировать атрибуты, заданные в вершинах (например, текстурные координаты, нормали, цвет и другие).

Наши входные данные — это набор полигонов (мы будем рассматривать только треугольники): координаты их вершин (система координат зависит от алгоритма) и значения атрибутов в каждой из этих вершин, которые в дальнейшем будут интерполироваться вдоль поверхности треугольника. Существует несколько подводных камней, которые я рассмотрю в этой статье:
  • Правило заполнения пикселей (filling convention)
  • Точность
  • Коррекция перспективы при интерполяции аттрибутов (perspective-correct interpolation)

Я рассмотрю три подхода к растеризации:
  • «стандартный» алгоритм, использующий наклон граней
  • целый ряд алгоритмов, основанных на использовании уравнений граней полигона (traversal-алгоритмы)
  • алгоритм растеризации в однородных координатах

Так же в конце будет ссылка на проект, который является примером реализации, оттуда же будут и примеры кода.
Читать дальше →
Total votes 16: ↑16 and ↓0+16
Comments1

Еще одна камера для FreeTrack

Reading time1 min
Views16K
Я знаю что данное изобретение уже прилично измусолено на просторах Интернета. И написав эту статью, точнее коротенький пост я не открываю америку. Скорее это мануал по разборке камеры.

Просто дело в том, что я собрался смастерить с ребенком подобный девайс и обнаружил что рекомендованные камеры сейчас просто не найти и все ссылки уже как правило устарели. Оббегав все магазины я не нашел ни чего подходящего, но почему то мой взгляд упал на камеру Ritmix RVC-007M
Читать дальше →
Total votes 6: ↑6 and ↓0+6
Comments8

ПЛИС — мои первые шаги

Reading time11 min
Views152K
Недавно я все-таки сделал свой первый шаг к ПЛИС и призвал вас за собой. Мое фанатическое увлечение ПЛИС и идея о том, что ПЛИС является лучшей платформой для создания любых устройств приобрела религиозный характер. Моя секта ПЛИСоводов проповедует полный отказ от микроконтроллеров, а особо экстремистская ветвь проповедует отказ не только от софт процессоров, но и вообще от последовательных вычислений!

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

Эта статья для новичков. В ней я опишу типичные проблемы, вопросы, заблуждения, ошибки, которые могут появиться в самом начале обучения (потому что они появились у меня). Однако, контекст статьи ограничен тем, что разработка ведется на ПЛИС от Altera в среде Quartus на языке Verilog.

Подробности
Total votes 37: ↑36 and ↓1+35
Comments41

Почему сеть Фейстеля работает? Объяснение «на пальцах»

Reading time4 min
Views55K

В продолжении статьи про blowfish хотелось бы поговорить про его основу — сеть Фейстеля. Люди «в теме» слышали про неё не одну сотню раз — эта сеть используется в подавляющем большинстве блочных шифров. Но вот вам, только честно, что нибудь понятно из картинки справа? Ну, допустим в одну сторону(шифрование) понятно, а обратно?
Если нет, то прошу под коврик
Читать дальше →
Total votes 34: ↑32 and ↓2+30
Comments10

Самая медленная инструкция x86

Reading time3 min
Views37K
Все знают и любят ассемблер x86. Большинство его инструкций современный процессор исполняет за единицы или доли наносекунд. Некоторые операции, которые декодируются в длинную последовательность микрокода, или ожидающие доступа к памяти могут исполняться намного дольше — до сотен наносекунд. Этот пост — о рекордсменах. Хит парад из четырех инструкций под катом, но для тех, кому лень читать весь текст, я напишу здесь, что главный злодей — [memory]++ при определенных условиях.

image

КПДВ взята из документа Агнера Фога, который, наряду с двумя документами от Intel (optimization guide и architecture software development manual) содержат много полезного и интересного по теме.
Читать дальше →
Total votes 45: ↑45 and ↓0+45
Comments28

Software renderer — 1: матчасть

Reading time29 min
Views83K
Программный рендеринг (software rendering) — это процесс построения изображения без помощи GPU. Этот процесс может идти в одном из двух режимов: в реальном времени (вычисление большого числа кадров в секунду — необходимо для интерактивных приложений, например, игр) и в «оффлайн» режиме (при котором время, которое может быть потрачено на вычисление одного кадра, не ограничено настолько строго — вычисления могут длиться часы или даже дни). Я буду рассматривать только режим рендеринга в реальном времени.

У этого подхода существуют как недостатки так и достоинства. Очевидным недостатком является производительность — CPU не в состоянии конкурировать с современными видеокартами в этой области. К достоинствам стоит причислить независимость от видеокарты — именно поэтому он используется как замена аппаратного рендеринга в случаях, когда видеокарта не поддерживает ту или иную возможность (так называемый software fallback). Существуют и проекты, цель которых — полностью заменить аппаратный рендеринг программным, например, WARP, входящий в состав Direct3D 11.

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

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

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

В конце статьи будет ссылка на гитхаб проекта, который можно рассматривать как пример реализации.
Читать дальше →
Total votes 95: ↑90 and ↓5+85
Comments51

Почему свет движется со скоростью света?

Reading time5 min
Views84K
(Прим. пер. ― см. прим. пер. в конце поста)

Почему свет движется со скоростью света? Почему он просто не стоит на месте? Что приводит его в движение (тем более, такое быстрое)?

image

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

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

В нашей будничной жизни мы исходим из того, что движение — это некое расстояние (пространство), преодоленное за некое время. Однако, если мы решили, что это одно и то же, наше определение движение внезапно становится полной ерундой. «Я прохожу километр за каждый километр, который я прохожу» — кошмар какой-то!

Читать дальше →
Total votes 217: ↑199 and ↓18+181
Comments303

Эксперимент, который навсегда изменил наше представление о реальности

Reading time7 min
Views274K
Принцип неопределенности говорит, что мы не можем знать определённые свойства квантовой системы в один и тот же момент времени. Например, мы не можем одновременно узнать положение частицы и ее скорость. Но что это говорит нам о реальном мире? Если бы мы могли заглянуть за кулисы квантовой теории, обнаружили бы мы, что объекты действительно обладают определенным положением и скоростью? Или принцип неопределенности означает, что на фундаментальном уровне объекты просто не имеют четкой координаты и импульса одновременно. Другими словами, неполна ли наша теория или реальность «размыта» на самом деле?

Читать дальше →
Total votes 145: ↑132 and ↓13+119
Comments205

«Бэкапы» в живом организме

Reading time2 min
Views14K
Я решил написать данную статью, так как в этом топике shifttstas выразил заинтересованность в описании биологических структур языком понятным программистам.

Сейчас я затрону тему сохранения и резервного копирования информации в ДНК. Для начала небольшой ликбез на тему ДНК:
Дезоксирибонуклеиновая кислота (ДНК) — макромолекула, обеспечивающая хранение, передачу из поколения в поколение и реализацию генетической программы развития и функционирования живых организмов. ДНК содержит информацию о структуре различных видов РНК и белков. ДНК содержится во всех живых организмах и даже в тех организмах «живость» которых вызывает сомнения.
Nosce te ipsum
Total votes 45: ↑36 and ↓9+27
Comments56

Виртуализация⁰

Reading time5 min
Views25K
Классическая теория эффективной виртуализации и обзор состояния индустрии в целом описаны в моей предыдущей публикации. В этой статье речь пойдёт о поддержке виртуализации в широком смысле в архитектуре Intel IA-32.


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

Эта статья — нулевая в небольшой серии о технологиях Intel, помогающих представить компьютер не тем, чем он в реальности является, для программ (в т.ч. операционных систем, BIOS и прошивок), на нём запущенных.
В ней не будет говориться о настройке конкретных VMM, прозрачной миграции виртуальных машин, создании невидимых руткитов и многих других интереснейших вещах, произрастающих из этой фрактальной и потому неисчерпаемой темы. Мой взгляд будет с позиции системного программиста, занимающегося разработкой операционных систем и firmware или мониторов виртуальных машин и симуляторов, а также всех им сочувствующих.
Читать дальше →
Total votes 42: ↑36 and ↓6+30
Comments7

Виртуализация¹

Reading time9 min
Views39K
В предыдущей части я рассказал о трёх режимах IA-32: защищённом, VM86 и SMM. Хотя их и не принято связывать с виртуализацией, они служат для создания изолированных окружений для программ, исполняемых на процессоре. В этой статье я опишу «настоящую» технологию виртуализации Intel VT-x. Я хочу показать, как теория эффективной виртуализации проявляется в каждом аспекте её практической реализации.



На КДПВ: Запущенная под управлением Ubuntu Linux программа Oracle VirtualBox, в которой запущена операционная система MS Windows XP, в которой исполняется симулятор Bochs, в котором запущена операционная система FreeDOS, в котором запущен симулятор MYZ80 для процессора Z80, в котором загружена операционная система CP/M (в полноэкранном режиме).
Читать дальше →
Total votes 36: ↑33 and ↓3+30
Comments8

oDesk (Upwork). Мой опыт за полтора года

Reading time12 min
Views445K
Вот уже полтора года я зарабатываю фрилансом на бирже oDesk. За это время у меня накопилось много материалов по данной теме. В данном топике я собрал все в одну статью и адаптировал для аудитории хабра.
image
Читать дальше →
Total votes 192: ↑185 and ↓7+178
Comments321

Как вращается камера в 3D играх или что такое матрица поворота

Reading time11 min
Views122K
В этой статье я кратко расскажу, как именно преобразуются координаты точек при повороте камеры в 3D играх, css-преобразованиях и вообще везде, где есть какие-то вращения камеры или предметов в пространстве. По совместительству это будет кратким введением в линейную алгебру: читатель узнает, что такое (на самом деле) вектор, скалярное произведение и, наконец, матрица поворота.
Читать дальше →
Total votes 113: ↑105 and ↓8+97
Comments44

Information

Rating
Does not participate
Location
Россия
Registered
Activity