Coding Overhead
16 subscribers
6 photos
4 videos
4 links
Здесь про GNU/Linux, DevOps, Platform Engineering, программирование и полезные инструменты из мира IT. Просто и по делу. Подробнее на сайте: https://coding-overhead.ru
Download Telegram
Channel created
Channel photo updated
💾 Мегабайты и мебибайты

Существует некоторая путаница между мегабайтами (MB) и мебибайтами (MiB), особенно когда речь идёт о скорости передачи данных в интернет-соединениях. На самом деле, всё достаточно просто для понимания, если разобраться в определениях.

Мегабайты (MB)
Мегабайт (MB) — это единица измерения информации, которая равна 1 000 000 байт (10^6 байт).

Мебибайты (MiB)
Мебибайт (MiB) — это единица измерения информации, которая равна 1 048 576 байт (2^20 байт).

То есть 1 MiB приблизительно равен 1.048576 MB.

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

Так же для скорости передачи данных часто используется мегабиты в секунду (Mbps), где 1 мегабит = 1 000 000 бит.
🔥5
This media is not supported in your browser
VIEW IN TELEGRAM
🔀 Файловые дескрипторы и перенаправление в Unix

В любом приложении для Unix-подобных ОС всегда существуют 3 файловых дескриптора:

- stdin (0)
- stdout (1)
- stderr (2)

В скобках указаны их номера.

Конвейеры чаще всего используются в shell-скриптах для перенаправления вывода одного приложения на вход другому. Простой пример:

$ ls -la | grep conf


Здесь создастся два параллельных процесса, один выведет содержимое текущей директории в stdout, а второй отфильтрует и выведет строки, полученные через stdin. С помощью символа конвейера | происходит перенаправление stdout первого процесса в stdin второго. Таким образом grep на вход получит результат вывода ls.

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

$ <команда> 2>&1


Как уже упоминалось, stderr имеет номер 2. Данной конструкцией мы перенаправляем файловый дескриптор с номером 2 (stderr) в файловый дескриптор под номером 1 (stdout). Для перенаправления в файл можно сразу указать его имя:

$ <команда> > <имя файла>
$ <команда> 2> <имя файла>


И наконец, чтобы одновременно перенаправить stdout и stderr:

$ <команда> > <имя файла> 2>&1
3
This media is not supported in your browser
VIEW IN TELEGRAM
🔍 ripgrep — быстрый поиск по файлам

ripgrep (команда rg) — это современная утилита для рекурсивного поиска текста в файлах, которая работает значительно быстрее традиционного grep, а так же многих других аналогичных инструментов.

ripgrep особенно удобен при работе с большими кодовыми базами — он автоматически пропускает бинарные файлы, скрытые файлы и директории из .gitignore, что делает поиск не только быстрым, но и релевантным.

Основные преимущества:

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

Примеры использования:

Простой поиск строки в текущей директории и поддиректориях:
$ rg "pattern"


Поиск с игнорированием регистра:
$ rg -i "pattern"


Поиск только в определённых типах файлов:
$ rg -t py "import"  # только в Python файлах
$ rg -t js "function" # только в JavaScript файлах


Показать контекст вокруг найденных строк:
$ rg -C 3 "pattern"  # 3 строки до и после


Поиск с выводом только имён файлов:
$ rg -l "pattern"
32
This media is not supported in your browser
VIEW IN TELEGRAM
🔍 fd — современная альтернатива find

fd — это утилита командной строки для быстрого поиска файлов и директорий. Долгое время я пользовался классической командой find, но скорость работы оставляла желать лучшего. Переход на fd, написанную на Rust, значительно упростил мне жизнь.

Почему стоит предпочесть fd:

Простой синтаксис — вместо find . -name "*.txt" пишем fd "*.txt"
Высокая скорость — параллельное выполнение делает поиск заметно быстрее
Цветной вывод — результаты подсвечиваются, что улучшает читаемость
Умный поиск — по умолчанию игнорирует файлы из .gitignore и скрытые файлы
Регулярные выражения — поддержка regex из коробки

Примеры использования:

# Найти все Python файлы
fd -e py

# Поиск по регулярному выражению
fd '^test_.*\.py$'

# Включить скрытые файлы и директории
fd -H config

# Выполнить команду для каждого найденного файла
fd -e jpg -x convert {} {.}.png # это просто 🔥

# Поиск только в директориях (или только файлов с -t f)
fd -t d cache


Интеграция с другими инструментами:

fd отлично комбинируется с fzf (про него будет в одном из следующих постов) для интерактивного поиска файлов:

vim $(fd -e py | fzf)


Полезные алиасы:

alias fdf='fd -t f'  # только файлы
alias fdd='fd -t d' # только директории
alias fda='fd -H' # включая скрытые


fd — один из тех инструментов, которые делают работу в терминале приятнее. После перехода на него я уже не возвращаюсь к find.
🔥41👍1
This media is not supported in your browser
VIEW IN TELEGRAM
🔄 Порядок байтов: Big-endian и Little-endian

Порядок байтов (byte order) — это то, как компьютер хранит многобайтовые числа в памяти. Различают два основных подхода:

Little-endian (младший байт первым):
Младший значащий байт хранится по меньшему адресу. Например, число 0x12345678:
Адрес:  0x00  0x01  0x02  0x03
Данные: 0x78 0x56 0x34 0x12


Big-endian (старший байт первым):
Старший значащий байт хранится по меньшему адресу. То же число 0x12345678:
Адрес:  0x00  0x01  0x02  0x03
Данные: 0x12 0x34 0x56 0x78


Где используется:

Little-endian: x86, x86-64, ARM (по умолчанию)
Big-endian: Старые PowerPC, SPARC, сетевые протоколы, PNG, JPEG

Network byte order:

Для сетевого взаимодействия используется стандарт big-endian, называемый network byte order. Это решает проблему совместимости: когда машины с разным порядком байтов обмениваются данными по сети, все используют единый формат.

Почему важно:

При работе с двоичными файлами, сетевыми пакетами или межпроцессным взаимодействием игнорирование порядка байтов приведёт к некорректной интерпретации данных. Всегда важно знать, в каком формате хранятся ваши данные.
👍31
🔒 TLS — шифрование веб-трафика

TLS (Transport Layer Security) — криптографический протокол, обеспечивающий защищённое соединение между клиентом и сервером и защиту от атак типа Man-in-the-Middle.

Протокол появился в 1999 году как замена устаревшему SSL от Netscape. При этом термин "SSL" по инерции всё ещё используется в обиходе.

Основные задачи протокола:

Конфиденциальность — данные шифруются и доступны только отправителю и получателю
Целостность — любое изменение данных при передаче будет обнаружено
Аутентификация — сервер подтверждает свою подлинность через цифровой сертификат

TLS Handshake

Если вкратце, процедура установки защищённого соединения TLS выглядит следующим образом:

• Клиент отправляет список поддерживаемых алгоритмов шифрования
• Сервер выбирает алгоритм шифрования и отправляет свой сертификат
• Клиент проверяет сертификат через цепочку доверия CA (Certificate Authority)
• Стороны генерируют уникальные ключи для этой сессии
• Весь последующий трафик шифруется этими ключами

Проблема SNI и Encrypted Client Hello

У TLS есть интересная проблема с приватностью. Когда мы подключаемся к HTTPS-сайту, имя домена передаётся незашифрованным через механизм SNI (Server Name Indication). Это значит, что наш провайдер видит, на какие именно сайты мы заходим, даже если весь трафик зашифрован.

Решение — Encrypted Client Hello (ECH), новое расширение TLS, которое шифрует и имя сервера. Поддержка уже добавлена в Firefox и Cloudflare, но массовое внедрение только начинается.

Heartbleed: крупнейшая уязвимость в истории TLS

В 2014 году обнаружили уязвимость в OpenSSL под названием Heartbleed. Баг позволял читать до 64 КБ оперативной памяти сервера при каждом запросе — туда могли попасть пароли, ключи шифрования, личные данные.

Уязвимость затронула 17% всех HTTPS-сайтов в интернете, включая Google, Facebook и Yahoo. Самое страшное — баг существовал в коде 2 года до обнаружения. После этого случая началась массовая ревизия криптографического кода и появились инициативы по финансированию разработки OpenSSL.

Другие интересные моменты

TLS Fingerprinting — по особенностям handshake можно определить нашу ОС и браузер, даже если мы используем VPN. Каждый браузер отправляет характерный набор алгоритмов и расширений.

Государственный MITM — в 2019 году Казахстан заставлял граждан устанавливать государственный root-сертификат для перехвата HTTPS-трафика. Браузеры быстро заблокировали эти сертификаты.

Квантовая угроза — квантовые компьютеры смогут взломать современные алгоритмы шифрования. TLS 1.3 уже готовится к постквантовым алгоритмам, которые NIST стандартизирует прямо сейчас.
👍3
🧟 nohup — процессы, которые не умирают

Подключились к серверу по SSH, запустили долгую задачу, закрыли ноутбук — и процесс умер. Знакомо?

При закрытии терминала система отправляет сигнал SIGHUP (hangup) всем дочерним процессам, завершая их. Утилита nohup решает эту проблему — она игнорирует этот сигнал.

nohup ./long_task.sh &


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

Если вывод не нужен — перенаправляем в /dev/null (подробнее про перенаправления в этом посте):

nohup ./script.sh > /dev/null 2>&1 &


Несколько нюансов:
• После запуска можно безопасно закрыть терминал
• Процесс продолжит работу с PPID=1 (Parent Process ID)
• Для интерактивного управления задачами лучше подойдут screen или tmux

Простая утилита, которая выручает, когда нужно быстро запустить что-то долгоиграющее без лишних настроек.
🔥3
Всё, что нужно знать про кубер
😁4
🔐 MFA — многофакторная аутентификация

MFA (Multi-Factor Authentication) — метод аутентификации, при котором личность подтверждается через два или более независимых фактора. Смысл простой: даже если пароль утёк — а это случается регулярно через утечки баз данных — без второго фактора войти в аккаунт не получится.

Часто встречается термин 2FA (Two-Factor Authentication) — это частный случай MFA, где используются ровно два фактора. На практике "2FA" и "MFA" используются как синонимы, поскольку большинство реализаций двухфакторные. Разница лишь в том, что MFA теоретически допускает три фактора и более.

MFA необходим везде, где хранится что-то важное: GitHub и GitLab, облачные консоли AWS/GCP/Azure, корпоративная почта, менеджеры паролей, VPN-доступ к production-серверам.

Три категории факторов

Все факторы делятся на три группы:

Знание (knowledge) — пароль, PIN-код, секретный вопрос
Владение (possession) — телефон, аппаратный ключ, смарт-карта
Биометрия (inherence) — отпечаток пальца, Face ID, сканирование сетчатки

Важный момент: два пароля — это не MFA. Факторы должны быть из разных категорий. Пароль + SMS-код — это MFA. Пароль + секретный вопрос — нет, оба из категории «знание».

Методы второго фактора — от слабых к сильным

SMS-коды — самый слабый вариант. Уязвимы к SIM swapping (мошеннический перевыпуск SIM-карты) и перехвату через устаревшие уязвимости протокола SS7. Тем не менее лучше, чем ничего.

TOTP (Time-based One-Time Password) — приложения вроде Google Authenticator или Aegis генерируют одноразовые коды локально. Код не передаётся по сети, перехватить его значительно сложнее. Минимальный стандарт для всех рабочих аккаунтов.

Push-уведомления — удобны, но подвержены атаке MFA fatigue: злоумышленник спамит запросами на вход, пока жертва случайно не нажмёт «Подтвердить».

Аппаратные ключи (YubiKey, Titan) — самый надёжный классический метод. Криптографическая аутентификация с физическим подтверждением нажатием кнопки на устройстве. Именно их стоит использовать для привилегированных учётных записей и production-доступа.

Реальный пример: Cloudflare vs Twilio, 2022

В августе 2022 года одна и та же группа атаковала сразу несколько технологических компаний, в том числе Twilio и Cloudflare. Схема одинаковая: сотрудники получали SMS с фишинговой ссылкой на поддельную страницу входа. Страница в реальном времени перехватывала логин, пароль и TOTP-код и передавала их атакующим — те мгновенно использовали данные для входа в настоящий аккаунт.

Twilio взломали. Cloudflare — нет. Разница: у сотрудников Cloudflare были аппаратные FIDO2-ключи (YubiKey). Такой ключ криптографически привязан к домену сайта и физически не может сработать на поддельном адресе. Даже получив логин и пароль, атакующие не смогли пройти второй фактор.

MFA — необходимый минимум для любого важного аккаунта. Но у всех перечисленных методов есть общая проблема: пароль по-прежнему существует, а значит — может утечь. Об этом поговорим в следующем посте.
👍2🔥21