My blog

I write mostly about security, mail, web and linux. My contacts are: mail://me@andreybondarenko.com and shaman007 all around Telegram, FB chat, WhatsApp.

Primary use me@andreybondarenko.com and @shaman007:matrix.andreybondarenko.com

Buy me a beer / Автору на пиво:

shaman007@andreybondarenko.com (paypal)
17QxrNyk9BCrP6LGUbqCNnXCzu4oeoYKaH (btc) 0x57500960FBC986225209E597D5B97065A9A10043 (eth)

Links turned out to be useful / не потерявшие актуальности ссылки:

Растаможка автомобиля из России в Чехии
Поиск работы за границей РФ: доступ из вашей страны запрещен и другие важные вещи
Как правильно искать работу
Почему закон о блокировке сайтов в рунете – это очень плохо

Mastodon bookmarks media downloads.

Problem: if you’re hosting your own Mastodon instance and subscribe to some feed with images, your instance footprint would grow like hell. You can purge ‘old media,’ but that’ll ruin your bookmarks. This snippet will get all your media from bookmarks.

Generate a list of S3 URLs for media attached to bookmarked statuses. Output: export/bookmarked_media_s3_urls.txt

# script/list_bookmarked_media_s3.rb
#
# Generate list of S3 URLs for media attached to bookmarked statuses.
# Output: export/bookmarked_media_s3_urls.txt

require "fileutils"
require "uri"

S3_HOST   = "https://s3.andreybondarenko.com"
S3_BUCKET = "mastodon" # path-style bucket

EXPORT_DIR  = Rails.root.join("export")
OUTPUT_PATH = EXPORT_DIR.join("bookmarked_media_s3_urls.txt")

FileUtils.mkdir_p(EXPORT_DIR)

puts "Writing S3 URL list to: #{OUTPUT_PATH}"

File.open(OUTPUT_PATH, "w") do |out|
  Bookmark.includes(status: :media_attachments).find_each do |bookmark|
    status = bookmark.status
    next unless status

    status.media_attachments.each do |media|
      begin
        uploader = media.file if media.respond_to?(:file)
        next unless uploader

        key = nil

        # 1) Try file.path (often S3 key or local path)
        if uploader.respond_to?(:path) && uploader.path.present?
          path = uploader.path.to_s

          # If this is a local path with /system/ in it, strip everything up to /system/
          if path.include?("/system/")
            key = path.split("/system/", 2).last
            key = "system/#{key}"
          else
            # Otherwise assume it's already a key
            key = path.sub(%r{^/}, "")
          end
        end

        # 2) Fallback: parse from file.url if path wasn't usable
        if key.nil? && uploader.respond_to?(:url) && uploader.url.present?
          url = uploader.url.to_s

          if url.start_with?("http")
            uri = URI(url)
            # If path starts with /mastodon/, strip that as bucket prefix
            # /mastodon/system/... -> system/...
            path = uri.path.sub(%r{^/}, "")
            if path.start_with?("#{S3_BUCKET}/")
              key = path.sub(%r{^#{Regexp.escape(S3_BUCKET)}/}, "")
            else
              # If it's already like system/..., accept as key
              key = path
            end
          else
            # relative url like /system/media_attachments/...
            key = url.sub(%r{^/}, "")
          end
        end

        unless key && !key.empty?
          warn "Could not determine key for media #{media.id}, bookmark #{bookmark.id}"
          next
        end

        full_url = "#{S3_HOST}/#{S3_BUCKET}/#{key}"
        out.puts(full_url)
      rescue => e
        warn "Error for bookmark #{bookmark.id}, media #{media.id}: #{e.class} #{e.message}"
      end
    end
  end
end

puts "Done."

Sieve shinannigans

Welp, if you’re using Sieve with the Dovecot (like you should), the client may behave strange, due to Sieve needs some dot-files and they naturally may come in your mailbox/maildir dir. Some clients are aware, some clients not, but the best way is to put dotfiles somewhere else. Like:

  90-sieve: |
    plugin {
      sieve = file:~/sieve;active=/var/mail/sieve/%u/.dovecot.sieve
    }

Otherwise errors/warnings in the logs, like in Mail:app of the Nextcloud.

На злобу дня

У меня есть мнение насчет последних событий с неким Павлом, которое я оставлю при себе.

Но вот эта уверенность людей в том, что “компании могут/будут/хотят заботиться о моей приватности”, особенно в контексте некоего Павла…

Смотрите, быстрый privacy-101:

– информация, которую вы не хотите раскрывать никому не должна попадать в места, в контроле которых вы не уверены. Идеально: ее не будет существовать. Понятный краевой пример из жизни: если вы сняли эротический контент со своим участием, то лучше всего будет сразу отправить его своим родственникам, начальству, друзьям и Римскому Папе. Если вы не готовы так делиться – не создавайте этот контент. Вот так просто! Аналог air gap.

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

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

Разумеется, есть good enough случаи. Например, если вы не PEPs, не активист и т.п., то использование респектабельного менеджера паролей будет хорошей идеей, шифрование данный просто средствами ОС будет достаточно.

Разумеется, никто ради вас не будет палить уязвимость в AES.

Разумеется, если вас уже взяли в работу, то никакое шифрование вам не поможет. Есть вполне себе научная работа, показывающая, что реальная угроза лишения зрения и/или иссечения гениталий ломает 100% людей. Я эту работу читал, вы не хотите, просто на слово поверьте, что таки да.

Но, пожалуйста, используйте менеджеры паролей, шифрование файловой системы, не ставьте российское и китайское говно (Opera, все от Yandex или Mail.ru/VK)! Если у вас просто украли ноутбук и там все просто зашифровано средствами ОС, то вы 146% защищены, что ваши данные попадут в какие-то большие “сливы” и потом их как-то используют против вас.

Резервное копирование: как не плакать

Навеяно постом адвоката Сологуба, который я воспринял близко к сердцу: потеря архива документов для меня – страшный сон. А тут – чужие документы!

DISCLAIMER: Я не буду долго расписывать теорию и почти не коснусь события “ОБЫСК“. Я буду считать, что хранимое не приводит к гибели людей или серьезным потерям юрлиц. Будем считать, что у вас может произойти 3 события:

  1. ОШИБКА
  2. СБОЙ
  3. КАТАСТРОФА

ВАМ ПОНАДОБИТСЯ 3 копии:

  • Оперативная копия (КОПИЯ! Не сами файлы!). Это копия документов в вашем же компьютере или ноутбуке. Она предназначена для события ОШИБКИ: вы серьезно испортили документ и поняли это через 2-3 часа (дня). Для этого в вашем ноутбуке на ОС Mac OS X работает Time Machine. Она версионирует буквально всё, не идеальна, но когда надо быстро поднять копию “за день до” – это она. В Линуксе у меня для этого есть cronjob, в виндоусе не знаю, но такой софт есть.
  • Спасательная копия на случай СБОЯ: у вас ноутбук сгорел и не восстанавливается. Для этого вам надо сходить в ближайший овощной магазин и купить там накопитель, даже плохой по цене огурцов. Лучше всего USB HDD, но пойдет даже SD-карта (просто поверьте, что это лучше, чем вообще ничего, хоть и полный пиздец, просто если кроите, купите их несколько). Положите его в шкаф или сервант, но не втыкайте в компьютер. На этот накопитель вы сбрасываете свои файлики все целиком, когда вспомните. Так у вас будет копия вашей деятельности свежести 1-3 месяцев. Плохо? Но гораздо лучше полной потери.
  • Иисусья копия на случай КАТАСТРОФЫ: раз в 3 месяца вы отдаете SD-карту (шутка, разумеется что-то лучшее) с вашими файликами бабушке, любимой соседке или лучшему другу. Они их хранят в серванте. Если у вас сгорит дом, то хотя бы проблемы полной потери своего архива у вас не будет. Это будет пиздец, это будет сложно, все будет плохо, но чуточку лучше. Вот у моего дяди сгорел дом в котором был подвал: если бы он там держал самый дешевый сейф из ОБИ с украшениями жены и документами на все, то дом бы все равно сгорел, но проблем было бы меньше!
  • Если можете, купите подписку Backblaze или CrashPlan. Правда. С установленным их софтом вы скорее всего как-то внятно восстановитесь.

БОНУС!

Но ведь воры! Но ведь ОБЫСК. Это проблема. Воры от обыска отличаются тем, что воры не будут угрожать вас кастрировать или выколоть глаза (я сейчас не приведу ссылку на исследования, но эти 2 угрозы после череды пыток работают всегда, просто понимайте, что пытки ломают всех и вас тоже сломают), а АКАБЫ могут. По этому ваши файлы всегда должны быть зашифрованы. В Mac OS этo Vault, в Windows это BitLocker и они достаточно хороши, просто не отмечайте опцию “хранить запасной ключ в облаке”.

Для события ОБЫСК существует отрицаемая криптография, но мы не будем ее касаться. Тем не менее не надо Акабам упрощать жизнь, до стадии вырывания ногтей за пароль доходят не все Акабы.

А как у меня?

  • во-первых, я не использую облака, кроме своего собственного и в нем организована первая копия
  • во-вторых, так как потеря или компрометация моих данных не приведет к проблемам третьих лиц, все копируется в Backblaze. По договору, они мои данные расшифровать не могут. Ради меня они не будут рисковать, даже если и могут, good enough. Это третья копия сама по себе (первой копии) и еще одна копия второй копии.
  • в третьих, на некоторые устройства происходят нерегулярные и неавтоматические копирования раз в 2-3 недели. Зато про них никто не знает. Это вторая копия.
  • Все носители зашифрованы. Backblase гарантирует, что они тоже зашифрованы. Даже если это не так, ради меня они не будут это светить.

Yet another cluster update

UniFi: made a deployment and network setup. Does not see AP’s. 10001 UDP seems to be a problem, yet no idea why. Adopted them manually via SSH, now they work. Yes, consumes RAM for no reason. Why? No idea. However, the functionality is limited compared to the Windows app, and it does not provide me with anything valuable. Consume RAM and CPU, so be it, no use.

Mastodon: it wants Elasticsearch that wants RAM. OKAY, I didn’t even want to really use it. Maybe the next more powerful setup will do.