понедельник, 7 декабря 2020 г.

AWS enable MFA for all

 Есть штатная дока про включение и виды MFA

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa.html

Но - там ни слова про включение MFA как требование для всех. Впрочем, легко гуглится заметка их блога

https://aws.amazon.com/ru/blogs/security/how-to-delegate-management-of-multi-factor-authentication-to-aws-iam-users/

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

четверг, 3 декабря 2020 г.

Amazon cloud, Auto Scale groups, автоматическое обновление

Если машина - часть ASG и min-max-desired настроены (1-2-1 например, важно что max=min+1, desired=min) то оно само пересоздаст инстансы. Если нужно именно этот же инстанс обновлять, без его пересоздания - надо в сторону ansible смотреть.

Также, есть секция, которая запускается при каждом старте, что-то типа bootcmd, надо доки уточнить. И есть cloud_final_modules 

https://aws.amazon.com/ru/premiumsupport/knowledge-center/execute-user-data-ec2/

вот тут про bootcmd есть

https://stackoverflow.com/questions/6475374/how-do-i-make-cloud-init-startup-scripts-run-every-time-my-ec2-instance-boots

В плане, в эти блоки можно поставить ansible. Потому что userdata работает только при создании инстанса.

вторник, 24 ноября 2020 г.

возможные улучшения /tmp

 Если /tmp является частью раздела /, это может быть проблемой. В том числе - можно поймать майнера, как через redis, docker, так и php

https://www.sourceclear.com/vulnerability-database/security/remote-code-execution-rce/php/sid-4487

https://github.com/docker-library/redis/issues/217


В общем, читаем https://stackoverflow.com/questions/60151640/kdevtmpfsi-using-the-entire-cpu


И непосредственно по модификациям

echo 'tmpfs /tmp tmpfs rw,nosuid,nodev,relatime,size=816800k,mode=777,uid=0,gid=0 0 0' >> /etc/fstab

# rename or clean /tmp, create empty, then 

mount /tmp

chmod go-rwx /var/tmp

chmod 1777 /tmp


Может быть актуально и для centos, и для debian

воскресенье, 8 ноября 2020 г.

WSL и нормальные права на файлы

 Хоть винда это не совсем в этот блог, но там есть WSL, в котором работает линух. И там - если посмотреть в /mnt то будут виндовые диски, с правами 777 на всё. Благо, есть решение - чуть покопав, узнаём что там drvfs, и можно перемонтировать нужные диски так:

sudo umont /mnt/d

sudo mount -t drvfs D: /mnt/d -o metadata,uid=1000,gid=1000,umask=22,fmask=111

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

взято тут

https://devblogs.microsoft.com/commandline/chmod-chown-wsl-improvements/

Можно отдельные диски настраивать через fstab, правда пока не очень понятно как.

Также, тут

https://devblogs.microsoft.com/commandline/automatically-configuring-wsl/ (читать оба, про options - первый линк)

читать про otions, чтобы применить опции при старте (сразу для всех дисков).

Минимальный конфиг /etc/wsl.conf:

[automount]
options = "metadata"

Чуть посложнее

[automount]
 enabled = true
 root = /mnt/
 options = "metadata,umask=22,fmask=11"
 mountFsTab = false

четверг, 5 ноября 2020 г.

skynet, mikrotik, ipv6

Первым делом нужно в личном кабинете включить v6.

Далее, нужно проверить DUID, который должен совпасть с маком Lan1. "Особенность"==корявость v6 - тут применяют DUID - ид устройства. А оно привязано на мак 1 лана.

Теперь смотрим https://zametkit.blogspot.com/2014/04/ipv6-mikrotik-dhcp-client.html

Есть ещё такое

https://wiki.rtzra.ru/software/mikrotik/mikrotik-ipv6


PS Несколько доставляет, что запись на board.sknt.ru появилась в сентябре 2016, "и до сентября тест". И уже 4 года оно "тест".

пятница, 23 октября 2020 г.

selinux

 https://habr.com/ru/company/ruvds/blog/523872/

Сама статья средней интересности, но вот комментарии - то, ради чего эта заметка и сделана.

embden

18 октября 2020 в 17:22

+9

SELinux — это позорное пятно в безопасности Linux. Стоит хотя бы упомянуть, что реализация большинства инструментов в SELinux — это хромые поделия, в которых даже сами мантейнеры SELinux с трудом разбираются (зайдите, к примеру, на их github и посмотрите код mcstransd). Кроме этого, в SELinux есть два параллельных языка для написания политик безопасности, при этом в некоторых местах у них конфликтуют даже ключевые слова (то, что в одном называется typeattribute в другом записывается typeattributeset или как-то так). Систему категорий, кстати, практически забросили и пользуются ей только для разграничения виртуальных машин, хотя потенциал был (и есть) гигантский. Добавьте к этому, что в пользовательских дистрибутивах пользователи толком не могут защититься с помощью SELinux (адекватного UI и адекватной политики до сих пор нет, большая часть бинарников имеет одинаковый контекст безопасности), то Linux уже и не кажется правильным решениям для защищенного пользовательского десктопа.

nginx-vts и актуализация

 Продолжение к

https://dragonflybsd.blogspot.com/2019/02/nginx.html

https://dragonflybsd.blogspot.com/2019/03/nginx-prometheus-dashboard-grafana.html


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

https://github.com/vozlt/nginx-module-vts/network/members

 Лучше подобрать живую замену и переключиться.

Итак. Диагностика.

Запрашиваем

curl http://localhost/status/format/json

Если ответ 501 Not Implemented - или модуль не подключен, или не активирован в настройках.

То есть убеждаемся, что:

1) модуль собран и подключен

2) настройки примерно как в доке https://github.com/vozlt/nginx-module-vts#synopsis (в частности, может быть закомментирован vhost_traffic_status_zone)

Также, при наличии прометея и nginx-vts-exporter, можно запросить статистику

# curl 127.0.0.1:9913/metrics

Если вывод только такой

# HELP nginx_vts_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, and goversion from which nginx_vts_exporter was built.

# TYPE nginx_vts_exporter_build_info gauge

nginx_vts_exporter_build_info{branch="HEAD",goversion="go1.10",revision="8aa2881c7050d9b28f2312d7ce99d93458611d04",version="0.10.3"} 1

то опять же, статистика не отдаётся, при этом в его логах будет fetchHTTP failed HTTP status 501

пятница, 16 октября 2020 г.

2.5" диски без SMR, на объёмах более 1.5Тб

"SMR позволяет производителям предлагать более высокую емкость без необходимости кардинального изменения базовой технологии записи."
https://habr.com/ru/post/500214/

Но - оно совершенно не дружит с рейдами, особенно zfs.

А теперь по производителям.

WD. Выделился тем, что даже в NAS сериях молча сделал SMR, от чего против него подан групповой иск. От этого wd дал задний ход и разделил NAS серию на несколько (1). Так же, у них есть Purple серия, но одна проблема - это всё 3.5", а задача - диски в сервер с 2.5" отсеками. Также стали известны заменой скорости вращения на "индекс скорости", делая диски 7200+SMR вместо 5400+CMR.

Seagate. Заявляли что их серии для NAS честные (серия IronWolf), смотрим что данная серия не существует в виде HDD для 2.5". Оно есть, но уже SSD. Далее, открываем сайт
https://www.seagate.com/ru/ru/internal-hard-drives/cmr-smr-list/
и видим что 2.5" - только SMR.

Toshiba. Сделала небольшую доку
https://toshiba.semicon-storage.com/ap-en/company/news/news-topics/2020/04/storage-20200428-1.html

И ещё полезная табличка

https://www.hardwareluxx.ru/index.php/artikel/hardware/storage/49812-cmr-protiv-smr-vyvodim-proizvoditelej-hdd-na-chistuyu-vodu.html?start=4


Как итог: если нужны диски в NAS или сервер - лучше взять SSD, ну или смотреть seagate EXOS (учитывая что оно SAS). Так будет и быстрее, и без ущербной в данном случае технологии.

вторник, 29 сентября 2020 г.

Mongo+Kubernetes шаблоны

https://stackoverflow.com/questions/60924254/mongodb-replicaset-is-broken-in-kubernetes

https://dba.stackexchange.com/questions/236758/mongodb-replicaset-instance-re-join-after-kubernetes-pod-restart

Хотя там и идёт как "вопросы с ошибками", их можно взять за основу.

Но остаётся ещё вопрос. Что в случае кубера, что cfn - у нас после деплоя на выходе есть N обезличенных серверов и нет механизмов, что есть mongo1 а что есть mongoN и что автоматически сборку надо запустить ровно на одной из машин, причём все ноды уже должны быть установлены (резолвиться в днс как минимум). И если запуск сборки ещё можно решить на внешних скриптах, то с именами - всё печально.

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

Mongo: Delete existing replicaSet record

 Delete existing replicaSet record in Server C using the command


   shell> mongo 

   mongo> use local

   mongo>db.system.replset.remove({});

   mongo>exit

понедельник, 28 сентября 2020 г.

AWS: CDK

 Изучаем замену для cfn - cdk (AWS Cloud Development Kit)

"это платформа разработки программного обеспечения ... используя привычные языки программирования"

И вот для быстрого старта: https://youtu.be/bz4jTx4v-l8

И пример кода

https://github.com/aws-samples/aws-cdk-for-k3scluster

AWS CFN: несколько полезных ссылок для изучения CFN

7 Awesome CloudFormation Hacks

19 Best Practices for Creating Amazon Cloud Formation Templates

Continuous Delivery in the Cloud: CloudFormation

Эти 6 уроков работы с cloudformation я усвоил на всю жизнь

AWS CFN: замечание про последовательную выкатку стэка

 Если нам нужно выкатывать набор инстансов, то там можно указать DependsOn и сборка будет ждать готовности инстанса. Но в случае с ASG всё не так просто.

Во-первых, DependsOn на ASG - продолжит развёртывание по готовности самого ASG, но не его машин.

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

В третьих, есть механизмы CreationPolicy и UpdatePolicy (которые так же нужно вешать на инстанс, чтобы стек ждал готовности ноды) и через /opt/aws/bin/cfn-signal на ASG выставлять что нода готова.

Можно сделать внешний счётчик через WaitCondition + WaitConditionHandle.

У него есть нюанс. Если в случае *Policy используется формат --resource (ASGName), то в случае WaitCondition - такой формат не работает! Мы должны применять форму cfn-signal -e 0 !Ref OurWaitCondition, ну или использовать curl. У меня ушло много времени, чтобы найти этот "особый" формат. И да, если мы используем runcmd с блоком Sub - то вместо !Ref надо использовать  формат ${OurWaitCondition}.

Второй нюанс: Anytime you add a WaitCondition resource during a stack update or update a resource with a wait condition, you must associate the wait condition with a new WaitConditionHandle resource. Do not reuse an old wait condition handle that has already been defined in the template. If you reuse a wait condition handle, the wait condition might evaluate old signals from a previous create or update stack command.

И напоследок: Updates are not supported for this resource.


И ещё линки

https://github.com/awslabs/aws-cloudformation-templates/blob/master/aws/services/AutoScaling/AutoScalingRollingUpdates.yaml

https://aws.amazon.com/ru/blogs/mt/signaling-aws-cloudformation-waitconditions-using-aws-privatelink/

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-waitcondition.html

вторник, 15 сентября 2020 г.

LetsEncrypt: End of Life Plan for ACMEv1

 https://community.letsencrypt.org/t/end-of-life-plan-for-acmev1/88430

In June of 2020 we will stop allowing new domains to validate via ACMEv1.

In June of 2021 we will entirely disable ACMEv1 as a viable way to get a Let’s Encrypt certificate.

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

При этом быа ещё такая утилита dehydrated, тоже продали.

https://lukas.im/2020/01/30/selling-dehydrated/index.html

понедельник, 7 сентября 2020 г.

aws: ещё один графический дизайнер стэков

https://www.stackery.io/


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

Одно но: оно платное, хотя есть Developer версия,  1 seat, 1 linked AWS account, 6 active stacks

AWS CFN: Fixing UPDATE_ROLLBACK_FAILED

https://harrisonmilbradt.com/blog/fixing-update_rollback_failed-in-serverless/

Actions > Continue Update Rollback и там есть пропуск сломанных шагов. Также есть консольная версия

aws cloudformation continue-update-rollback --stack-name my-stack --resources-to-skip failed-resource1 failed-resource2

пятница, 21 августа 2020 г.

AWS: Cognito

 Есть у амазона сервис авторизации Cognito, позволяет настроить авторизацию гугла, oauth и подобным. 

https://aws.amazon.com/ru/blogs/database/get-started-with-amazon-elasticsearch-service-use-amazon-cognito-for-kibana-access-control/

Сам по себе сервис достаточно прост: сначала в User pools создаём пул юзеров, причём на старте достаточно "review defaults", потом создаем базу для вошедших юзеров - Identity.

Теперь в самом простом случае - заводим локальных пользователей, создаём группу (по доке выше) - и вот уже сервис можно использовать.

Замечание для kibana: после включения Cognito в настройках, авторизацию запрашивать не будет, нужно нажать в ES - Modify access policy и в Principal заменить * на хитрую строку, подробнее всё в той же доке выше.

четверг, 20 августа 2020 г.

rpmbuild: условия в Requires

 Starting with rpm-4.13, RPM is able to process boolean expressions in all dependencies (Requires, Recommends, Suggests, Supplements, Enhances, Conflicts). Boolean Expressions are always enclosed with parenthesis. They are build out of “normal” dependencies: either name only or name, comparison and version description.

https://rpm.org/user_doc/boolean_dependencies.html

То есть теперь можно написать такие вещи как

Requires: (pkgA or (pkgB and pkgC))

Supplements: (foo and (lang-support-cz or lang-support-all))

и так далее. НО - это всё есть только в centos8, в 7 и ниже версии старые, в 7 например 4.11.

пятница, 7 августа 2020 г.

AWS AD + AD FS

 Если нужно поставить AD FS для AWS AD - полноценно это не сделать, потому что AWS AD не даёт юзеров с правами domain administrator. 

In a default AD FS installation, AD FS uses two containers that require special AD permissions that your AWS Microsoft AD administrative account does not have. To address this, you will create two nested containers in your OU for AD FS to use. When you install AD FS, you tell AD FS where to find the containers through a Windows PowerShell parameter.

Поэтому создавать нужно через PowerShell, заглядывая в https://aws.amazon.com/jp/blogs/security/how-to-enable-your-users-to-access-office-365-with-aws-microsoft-active-directory-credentials/, выкидывая часть про azure и office, но "тело" там вполне универсально.

Для этого нужен Windows instance, введённый в домен.

вторник, 16 июня 2020 г.

fail2ban+systemd+sshd

У fail2ban начиная с версии 1.9.0 есть поддержка опции
backend = systemd

Но в centos, debian (например в 8) чаще 0.8, поэтому тут решение - подключать rsyslog

apt-get install rsyslog

/etc/rsyslog.d/sshd.conf:
authpriv.*      /var/log/auth.log
systemctl enable rsyslog
systemctl start rsyslog
ls -la /var/log/auth.log

И теперь как обычно
cat >> /etc/fail2ban/jail.local << EOF
[ssh]
enabled = true
bantime = 12m
EOF
(в случае centos поправить имя блока до sshd, файл лога при этом писать не в auth.log а в /var/log/secure, но в центос обычно rsyslog уже из коробки настроен как надо)

среда, 3 июня 2020 г.

Duo Unix - Two-Factor Authentication for SSH with PAM Support (pam_duo)

https://duo.com/docs/duounix

Очень удобная штука, позволяет управлять кто и куда может подключаться, 2FA для большей безопасности... Лучше с офсайтом ознакомиться.
Интересен ещё и тем, что есть интеграция с Cisco, например вход в VPN может штатно запрашивать подтверждение на телефоне.
Отдалённый аналог - google authenticator, но тот только генератор номеров, а тут полный стэк.

Помимо PAM, есть вариант настройки через login
https://duo.com/docs/loginduo

Есть и такая дока
https://www.stephenwagner.com/2018/05/06/configure-duo-mfa-centos-7-linux-with-pam_duo/

CloudFormation, ASG and Route53

Иногда нужно добавлять домены в Route53 при создании серверов. Для обычных EC2::Instance просто добавляем столько же секций, сколько нам нужно доменов. Всё усложняется, когда нужно делать динамические имена для ASG (Auto Scale Groups).
Вариант "в лоб": делим единый ASG на столько, сколько у нас инстансов, и уже к каждому привязываем конкретный поддомен и всё что нужно. Да, это дублирование как самих ASG, так и связанных LaunchConfiguration, потому что теперь они как минимум содержат номер, поддомен или ещё что-либо. То есть получаем по сути обычный EC::Instance, с небольщим отличием - самовосстановлением, если машина полностью ломается то она будет пересоздана автоматически.
Есть вариант через CloudMap, там уже есть некая гибкость, но нужно внимательно изучить
Есть и такое
https://underthehood.meltwater.com/blog/2020/02/07/dynamic-route53-records-for-aws-auto-scaling-groups-with-terraform/
но тоже надо смотреть, как оно внутри устроено и работает.
Далее, можно в UserData какими-то БД, внешними арбитрами итд вычислять нужные имена и далее через aws route53 манипулировать
Также есть Macro
https://github.com/awslabs/aws-cloudformation-templates/tree/master/aws/services/CloudFormation/MacrosExamples/Count

понедельник, 4 мая 2020 г.

Update MacOS

Если довелось обновлять mac os с mojave до catalina (например, если взят сервер в MacInCloud), и updater говорит что нет обновлений, нужно сделать
 sudo softwareupdate --reset-ignored
И после этого обновление появится.
НО! Если это MacInCloud - сначала нужно убедиться что сервер в совместимых! И желательно написать в саппорт (обязательно, если железо более старое чем mac mini late 2012)
рецепт взят отсюда

вторник, 21 апреля 2020 г.

AWS Cloud Map

Cloud Map allows you to register any application resources such as databases, queues, microservices, and other cloud resources with custom names. Cloud Map then constantly checks the health of resources to make sure the location is up-to-date. The application can then query the registry for the location of the resources needed based on the application version and deployment environment.
https://aws.amazon.com/ru/about-aws/whats-new/2018/11/introducing-aws-cloud-map/

https://aws.amazon.com/ru/blogs/aws/aws-cloud-map-easily-create-and-maintain-custom-maps-of-your-applications/

Video:
https://www.youtube.com/watch?v=fMGd9IUaotE

понедельник, 20 апреля 2020 г.

Jenkins: пропускаем шаг начальной настройки

При автоматической выкатке часто надо пропустить шаг настройки (мастер), есть несколько способов
1) java  -Djenkins.install.runSetupWizard=false -jar jenkins.war
Вариант через переменную (для докера)
ENV JAVA_OPTS "-Djenkins.install.runSetupWizard=false ${JAVA_OPTS:-}"

2) поставить плагин jcasc и при влитом конфиге он должен визард пропускать. Но не всегда, например https://github.com/jenkinsci/configuration-as-code-plugin/issues/393, поэтому 1 метод предпочтительнее.

3) Не проверялось, но иногда встречается в гугле
echo ${JENKINS_VERSION} > ${JENKINS_HOME}/jenkins.install.UpgradeWizard.state

среда, 8 апреля 2020 г.

Accessing and dumping Jenkins credentials

https://codurance.com/2019/05/30/accessing-and-dumping-jenkins-credentials/

Jenkins pipeline jobs

Помимо Freestyle задач, если pipeline, это код на груви. Главные преимущества - переносимость, возможность держать конфиги в системе контроля версий, сами pipelines можно прямо из гита вызывать, можно код положить в Jenkinsfile и передавать вместе с проектом.
Минусы - сложность освоения, зачастую совершенно невнятные ошибки, что раньше в вебе накликивалось за пол часа, теперь надо долго и вдумчиво писать.
Чуть добавляет сложности то, их несколько видов, и они не очень совместимы.
По синтаксису: scripted, declarative
Pipeline, multibranch pipeline

Intro
https://jenkins.io/doc/book/pipeline/getting-started/
https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md

Next
https://jenkins.io/doc/book/pipeline/syntax/

2 models
https://jenkins.io/doc/pipeline/steps/pipeline-model-definition/

For plugins
https://jenkins.io/doc/pipeline/steps/

Очень достойные документы, где описано очень много полезного. post, when... Хотя бы по диагонали но прочитать.
https://www.blazemeter.com/blog/how-to-use-the-jenkins-scripted-pipeline/
https://www.blazemeter.com/blog/how-to-use-the-jenkins-declarative-pipeline/

Advanced:
https://www.cloudbees.com/blog/top-10-best-practices-jenkins-pipeline-plugin

PS
Раньше формат вызова плагинов был примерно таким
step([$class: 'ArtifactArchiver', artifacts: 'something'])
В новом синтаксисе (года с 2016) это гораздо читаемее и сокращается до
archiveArtifacts 'something'
Но. Не всегда. Например, в 2020 у плагина Mailer существует только такой формат вызова
step([$class: 'Mailer']): E-mail Notification
https://jenkins.io/doc/pipeline/steps/mailer/

Чуть больше про это
https://stackoverflow.com/questions/48797509/class-syntax-in-jenkins-scripted-dsl

PS2
When a recorder is run from a pipeline, it might set the build’s status (for example to unstable), but otherwise is likely to work intuitively. Running a notifier is trickier since normally a pipeline in progress has no status yet, unlike a freestyle project whose status is determined before the notifier is called. To help interoperate better with these, you can use the catchError step, or manually set a build status using currentBuild.result. See the help for the catchError step for examples.

https://github.com/jenkinsci/workflow-basic-steps-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/workflow/steps/CatchErrorStep/help.html
catchError : This step is most useful when used in Declarative Pipeline or with the options to set the stage result or ignore build interruptions. Otherwise, consider using plain try-catch-finallyblocks.

вторник, 7 апреля 2020 г.

Mac: Нормальный вывод du

Не знаю какие дендропришельцы делали вывод для du, штатно это что-то совершенно нечитаемое и бесполезное, и даже -h не улучшает ситуацию.
Правильная команда:
df -lHPh
И в конфиг ~/.bash_profile
alias du='df -lHPh'

среда, 1 апреля 2020 г.

Jenkins: передача параметров между задачами

Иногда (часто) есть несколько задач, между которыми надо передавать аргументы.
В случае, если первая задача хочет запустить вторую, тут очень просто. Ставим плагин Parameterized Trigger plugin, во второй задаче перечисляем что мы хотим получать, а в первой добавляем шаг сборки "Trigger/Call builds on other projects" и там есть поле для переменных, которые мы передаём, формат обычный, NEW_VAR=some_var
как-то так
А вот от второй задачи к первой - весьма сложно. Пожалуй, самым простым вариантом - во второй задаче выводим нужные переменные в файл, а в первой импортируем переменные из файла, через шаг сборки Inject environment variables. То есть через trigger build запускаем вторую задачу, там внутри пишем нужные переменные в общедоступный файл (поэтому будет работать только внутри 1 сервера, и папки лучше всего брать $HOME или /tmp), а следущим шагом через inject читаем переменные, формат переменных обычный, на строку VAR="value", сам путь в Properties File Path
примерно так

вторник, 31 марта 2020 г.

aws secrets manager

https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html
https://docs.aws.amazon.com/secretsmanager/latest/userguide/best-practices.html
https://github.com/jenkinsci/aws-secrets-manager-credentials-provider-plugin/blob/master/docs/README.md
https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/index.html#cli-aws-secretsmanager

Оказывается, через pipeline очень удобно работать с хранящимися данными

Работать лучше через CLI, у веба есть какие-то баги
Bugs
All secrets must be uploaded via the AWS CLI or API. This is because the AWS Web console currently insists on wrapping your secret string in JSON.

Jenkins и upload to S3

Жил-был дженкинс, работал себе, задачи на нём вида Freestyle крутились себе. И сразу оговорка, нода, на которой запускалась задача выкатки, не в амазоне, дальше это будет важно.

Есть для выкатки через freestyle плагин s3 publish, он же /s3/ в плагинах. Но есть у него огромный, гигантский косяк: он не умеет в ACL. Вообще не умеет. Ни в каком виде. А на офсайте жалкая отмазка "выставите нужные права на весь бакет через IAM", что разумеется далеко не всегда приемлемо.
Да, у него есть metadata, но толку от неё ровно 0. Потому что оно мало того что не умеет Canned ACL, так даже x-amz- не выставить, там захардкожен префикс, что-то вроде x-amz-meta-, и ничего с этим не сделать. Ладно, не было печали, посмотрим другие варианты.
aws s3 cp|sync
s3cmd put|sync
итд - поскольку нода не в амазоне, мы не можем настроить IAM на выкатку без токена, а по некоторым причинам его могут не давать сделать.
Хорошо, есть вроде неплохой плагин aws pipeline plugin, он умеет сильно больше чем s3 plugin, поставим. И первый косяк, оно не умеет в freestyle. Надо переписывать задачу в pipeline. Что ж, давно было желание, переписали. Второй косяк. s3Upload не работает, потому что конфликт имён с s3 plugin. И как только мы удаляем s3 plugin, у нас ломаются все связанные задачи. А их может быть больше десятка. Но и это не всё. Косяк 3. Похоже, что s3 plugin выкатывал файлы через Jenkins, потому что оно просто работало. А aws pipeline делает это с самой ноды, и ничего не работает. Никто же не добавил AWS_ переменные. Но даже если добавить withAWS - может не заработать, если у нас не 2 переменные а 3: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN. И передать их как-то - не выйдет. И выставить через def в начале пайплайна - тоже не работает. Так что 2 плагина, функционал которых фактически не пересекается, вместе стоять не могут.

Тут на помощь приходят copyArtifact и более удобный в данном случае stash, при условии что у нас есть нода в амазоне, на которой можно будет сделать unstash + s3Upload.

На то, чтобы выяснить и отладить это всё, может уйти не 1 день.
Если бы удалось пропихнуть фикс в s3 plugin с переименованием s3Upload во что-то ещё (в этом модуле всего 2 функции, в отличие от заточенный под пайплайны aws pipeline), то они могли бы существовать мирно вместе. А так - им надо обоим ставить тэг Conflicts и блокировать совместную установку.

понедельник, 30 марта 2020 г.

Debian: EOL Шрёдингера

Дебиан настолько гениален и велик, что у него бывает EOL Штрёдингера. Когда он еол и не еол одновременно.
https://www.debian.org/releases/jessie/index.ru.html
Jessie получает долгосрочную поддержку (LTS) вплоть до конца июня 2020 года.

Но. https://lepkov.ru/debian-8-jessie-repo-update/
Для пакета jessie-updates вы можете просто удалить его из своего /etc/apt/sources.list. Это бесполезно, потому что все пакеты, которые были в обновлениях jessie, были объединены в jessie, когда был выпущен Debian 8.11.

Пакет jessie-backports был заархивирован на archive.debian.org, поэтому вы можете использовать:
...

Более того, просто поправив бэкпорты, получаем сразу 2 ошибки.
E: Release file for http://archive.debian.org/debian/dists/jessie-backports/InRelease is expired (invalid since 3600d 1h 9min 51s). Updates for this repository will not be applied.

И то, что пакеты больше не согласованы. Банальный certbot УЖЕ не поставить, ругается на зависимости слишком свежих версий. Но это уже совсем другая история...

AWS S3: немного про ACL

Для начала, как посмотреть права на файле в s3, кроме веба?
s3cmd info s3://(bucket)/(dir/file)
aws s3api get-object-acl --bucket (bucket) --key (dir/file)

В выводе будут строки ACL:
Но что с этим знанием делать дальше? Для начала, читать доку

пятница, 20 марта 2020 г.

CloudFormation для VPC Peering

Продолжение https://dragonflybsd.blogspot.com/2020/01/amazon-vpc.html, при настройке через CloudFormation

Казалось бы, настройка элементарна
  VPCPeeringWithMain:
    Type: AWS::EC2::VPCPeeringConnection
    Properties:
      VpcId:
        Fn::ImportValue: !Sub "${AWS::StackName}-VPC"
      PeerVpcId: !Ref VPCMainID

Но нет. Элементарно ловится ошибка
VpcPeeringConnection failed to stabilize. State: [failed]
Открываем доку
https://aws.amazon.com/ru/premiumsupport/knowledge-center/cloudformation-vpc-peering-error/
и начинаем читать. Оказывается, там много подводных камней. Если пирятся разные аккаунты - нужно озаботиться ролями, если разные регионы - читаем
The Region code for the accepter VPC, if the accepter VPC is located in a Region other than the Region in which you make the request.
и так далее, и разумеется, в основной доке про это явно - нет.

И это всё в дополнение к

Скриптик для 2fa, для aws cli

https://github.com/dragonfly-net/utils/blob/master/aws/aws_cli_auth.sh
заменить юзера и аккаунт (цифровой)
Запускать через source aws_cli_auth.sh (code)

воскресенье, 8 марта 2020 г.

Отключение ipv6 в debian

Отключать v6 не рекомендуется, если он работает. Но бывает так, что его включение не даёт ничего кроме проблем. Например, пришлось выключить в hetzner, потому что с ним подключения отваливались по таймауту.

sudo vi /etc/sysctl.d/70-disable-ipv6.conf
# Turn off IPv6
#
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1
И перечитываем конфиг
sudo sysctl -p -f /etc/sysctl.d/70-disable-ipv6.conf


debian: заменяем репы для устаревших сборок



Когда сборка становится EoL, репы удаляют, и нужно переключиться на archive.
Пример для wheezy например тут
https://www.ispsystem.ru/news/debianwheezyend

Хотя security.debian.org тоже удалён. В общем, строки будут примерно такие
deb http://archive.debian.org/debian wheezy main
deb http://archive.debian.org/debian-security wheezy/updates main
При возникновении ошибки

E: Release file for http://archive.debian.org/debian-security/dists/wheezy/updates/Release is expired (invalid since 333d 5h 21min 4s). Updates for this repository will not be applied.
нужно выполнить
sudo apt-get -o Acquire::Check-Valid-Until=false update

вторник, 3 марта 2020 г.

aws: Конвертируем существущую инфру в cloudformation template

Using CloudFormer (Beta) to Create AWS CloudFormation Templates from Existing AWS Resources

Important
CloudFormer is currently in beta. We recommend against utilizing it in critical or production environments.

Вкратце. Через CloudFormation создаём новый стэк, examples, CloudFormer. Далее будет создана виртуалка (которая тарифицируется, да, t2.medium), задаём ей логин-пароль, подключаемся. Выбираем что вносим в шаблон, на выходе получаем шаблон.

IP-KVM через QEMU

Да, бывает и такое извращение. Когда железо бытовое для уменьшения цены, и не осилить покупку простейших квм по 5к, начинаются маразмы "загрузитесь в консоль восстановления, поднимите qemu, и потом.."
Собственно, сама команда
qemu-system-x86_64 \
-m 2048M \
-net nic -net user \
-enable-kvm \
-cpu host,nx \
-M pc \
-smp 2 \
-vga std \
-drive file=/dev/sda,format=raw,index=0,media=disk \
-drive file=/dev/sdb,format=raw,index=1,media=disk \
-vnc :0,password \
-monitor stdio

Полная версия
https://habr.com/ru/company/selectel/blog/464565/
И да, страдает таким маразмом именно селектел. То, что хецнер сделал лет 15 назад (подключаемые kvm), для них пока недостижимый прогресс. Минимум тем, что не увидеть что сейчас на сервере творится, что за ошибки в консоли и подобное. Не всегда ребут возможен, минимум тем что текущее состояние аварии гораздо важнее простоя из-за режима восстановления.

четверг, 27 февраля 2020 г.

7 Awesome CloudFormation Hacks

https://garbe.io/blog/2017/07/17/cloudformation-hacks/

Немного про говнокод в aws

Есть уже рабочий стэк, который трогать не хочется, и нужно задеплоить 1 новую машину, для этого заводим новый VPC. Причём уже есть ASG+LaunchConfig где всё деплоится как надо, но тут задача, где больше 1 сервера точно не понадобится, vpn, jenkins итд, много когда более 1 машины просто не нужно.
Открываем "простой" пример, оф. пример, делаем по аналогии, запускаем cfn. На выходе ошибка
Value () for parameter groupId is invalid. The value cannot be empty (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameterValue; Request ID: ...
Открываем доку и видим
[EC2-Classic, default VPC] The names of the security groups. For a nondefault VPC, you must use security group IDs instead.

Думаем, при чём тут это, находим пост (2), заменяем 
"SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
на
"SecurityGroupIds" : [ { "Fn::GetAtt" : [ "InstanceSecurityGroup", "GroupId" ] }],
Наслаждаемся ошибкой
Security group sg-059f48c4cb6c45ad2 and subnet subnet-8206c0d8 belong to different networks. Потому что в SG у нас корректно замапилась группа и VPC, а тут взят дефолтный параметр (помним, что у нас иной VPC?). Со злости удаляем вообще SecurityGroupIds, запускаем, радуемся что всё создалось. А потом идём в управление серверами.. и видим что VPC - default и SG пустой!
Вообще, если посмотреть в параметры, там есть LaunchTemplate. Но пока продолжать разгребать эти конюшни.
Судя по всему, тут роляет именно SecurityGroupIds + SubnetId, про что нигде внятно не сказано! Если будет SecurityGroups+SubnetId (второе на верхнем уровне) то будет ошибка
The parameter groupName cannot be used with the parameter subnet (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameterCombination;
 Хотя можно попробовать вынести SubnetId в NetworkInterfaces (с обвязкой, читаем доку),  и с SecurityGroups...

вторник, 25 февраля 2020 г.

AWS WAF – Брандмауэр для интернет‑приложений

https://aws.amazon.com/ru/waf/

AWS WAF – это брандмауэр для интернет‑приложений, который позволяет защитить их (или различные API) от распространенных сетевых эксплойтов, способных повлиять на доступность, создать угрозу безопасности или задействовать чрезмерное количество ресурсов API или приложения. AWS WAF предоставляет полный контроль над тем, каким именно образом трафик будет достигать приложений пользователя: он сможет создавать правила безопасности, которые будут блокировать такие выполняемые по распространенным шаблонам атаки, как SQL-инъекции или межсайтовый скриптинг, а также правила, которые будут фильтровать трафик с определенным характером. Начать работу с AWS WAF можно чрезвычайно быстро благодаря наличию управляемых правил – предварительно сформированного набора правил, управляемых AWS или продавцами рынка AWS Marketplace. Управляемые правила для WAF позволяют справиться даже с проблемами из списка десяти главных угроз безопасности по версии OWASP. Эти правила регулярно обновляются по мере возникновения новых проблем. AWS WAF предлагает полнофункциональный API, позволяющий автоматизировать процессы создания, развертывания и обслуживания правил безопасности.

Но в настройке это весьма... объёмная вещь. Конфиги в сотни и сотни строк - вполне норма.
Пример шаблонов
https://aws.amazon.com/ru/solutions/aws-waf-security-automations/
Шаблон к нему
https://s3.amazonaws.com/solutions-reference/aws-waf-security-automations/latest/aws-waf-security-automations.template
40 кб. Это к вопросу размеров. Выкатить несколько независимых стэков - меньше выходит.

Ещё пример, из которого можно собрать нужное
https://github.com/aws-samples/aws-waf-sample

вторник, 18 февраля 2020 г.

aws: Load Balancer Types

Elastic Load Balancing supports the following types of load balancers: Application Load Balancers, Network Load Balancers, and Classic Load Balancers. Amazon ECS services can use either type of load balancer. Application Load Balancers are used to route HTTP/HTTPS (or Layer 7) traffic. Network Load Balancers and Classic Load Balancers are used to route TCP (or Layer 4) traffic.

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html (и вообще лучше ознакомиться, там подходы разные)
https://docs.aws.amazon.com/elasticloadbalancing/latest/application/

Когда нам нужно обрабатывать http(s) трафик, лучше всего подходит application LB. Чем он лучше классического:
https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html#application-load-balancer-benefits

Моменты, о которых надо помнить
- Требуется минимум 2 AZ. Даже если данные есть только в одной, остальные должны просто быть. А вот 1 сети в каждой AZ будет достаточно.
- Не забыть про security groups
- Желательно добавить Health Checks для сервера

В случае с CloudFormation можно начать отсюда
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html
Не путать с почти такой же страницей, но без V2 - так как это classic lb

You can specify the AvailabilityZones or Subnets property, but not both.

среда, 12 февраля 2020 г.

Install aws cli on mac

Самый простой метод - через pip
pip3 install awscli --upgrade --user
но после этого надо добавить путь в path
export PATH=~/Library/Python/3.7/bin:$PATH

Другие варианты:
https://docs.aws.amazon.com/cli/latest/userguide/install-macos.html

Также есть aws cli version 2
For AWS CLI version 2, it doesn't matter if you have Python installed and if you do, it doesn't matter which version. AWS CLI version 2 uses only the embedded version of Python (and any other dependencies) that is included in the installer.

https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /

пятница, 7 февраля 2020 г.

Jenkins plugins: Usage plugin

https://plugins.jenkins.io/plugin-usage-plugin
https://wiki.jenkins.io/pages/viewpage.action?pageId=73532011
Показывает список установленных плагинов, а для классических задач покажет ещё кто использует (но только использует явно, по связанности может показать нули), а по кнопке expand даже покажет, какими задачами какой плагин используется.

четверг, 6 февраля 2020 г.

Jenkins+aws

Самый простой вариант это ставим aws cli и через execute shell, но далеко не самый правильный

https://github.com/jenkinsci/pipeline-aws-plugin
Умеет работать с s3, cfn, sns и ещё чуть по мелочи

https://jenkins.io/doc/pipeline/steps/s3/
https://plugins.jenkins.io/artifact-manager-s3
более частные случаи

понедельник, 27 января 2020 г.

Jenkins: более гибкие возможности с freestyle configuration

При работе с freestyle configuration часто встают вопросы переноса конфигураций, их архивирования, контроле версий и прочем. Они конечно доступны в xml формате, но работа "напрямую" крайне неудобна. Плюс нет механизмов контроля подключённых плагинов, нужно отдельно получать их список с версиями и носить в отдельных файлах. Но если нет возможности перейти на pipeline, есть плагины, облегчающие жизнь.

воскресенье, 26 января 2020 г.

Jenkins, HTML documentation and security

Jenkins может сам генерировать документацию, но доступ к ней будет ограничен по CSP
Jenkins 1.641 / Jenkins 1.625.3 introduce the Content-Security-Policy header to static files served by Jenkins (specifically DirectoryBrowserSupport). This header is set to a very restrictive default set of permissions to protect Jenkins users from malicious HTML/JS files in workspaces, /userContent, or archived artifacts.

Unfortunately, several popular, useful plugins are affected by this and lose part of their functionality unless the default rules are relaxed.
https://wiki.jenkins.io/display/JENKINS/Configuring+Content+Security+Policy

Сначала для обхода надо было выставлять hudson.model.DirectoryBrowserSupport.CSP, например через консоль
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' 'unsafe-inline' data:;")

Или через конфиг файлы
https://kb.froglogic.com/squish/integrations/jenkins/content-security-policy-csp-web-report/
https://stackoverflow.com/questions/37618892/jenkins-content-security-policy

Но с версии 2.200 введено улучшение - отдельный путь для документации, зовётся Resource root URL. По встроенной справке много подробностей.

https://issues.jenkins-ci.org/browse/JENKINS-41891

четверг, 16 января 2020 г.

Amazon RDS for PostgreSQL Supports User Authentication with Kerberos and Microsoft Active Directory

https://aws.amazon.com/ru/about-aws/whats-new/2019/10/amazon-rds-for-postgresql-supports-user-authentication-with-kerberos-and-microsoft-active-directory/
Posted On: Oct 29, 2019

PostgreSQL versions 11.4, 10.9 and above are supported with Active Directory integration.
Требуется именно Microsoft Active Directory, и тогда в настройках датасета можно будет включить AD. Но тут есть нюанс, ИЛИ IAM, ИЛИ AD.

amazon VPC - общение между подсетями

A VPC peering connection is a networking connection between two VPCs that enables you to route traffic between them privately. Instances in either VPC can communicate with each other as if they are within the same network. You can create a VPC peering connection between your own VPCs, with a VPC in another AWS account, or with a VPC in a different AWS Region.

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

https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html (и далее)
https://docs.aws.amazon.com/vpc/latest/peering/vpc-peering-basics.html

Вкратце - сначала нужно установить VPC Peering (доверенную связь) - в одноимённом разделе сначала на первом аккаунте/регионе отправляем запрос, потом на втором аккаунте/регионе подтверждаем связь.
Далее в routing tables с обоих сторон добавляем новые сети. При разделении на приватные и публичные сети - добавлять нужно в обе сети. Приватные - для нормального обмена, публичные - чтобы получать доступ к серверам из публичной сети, а так же при подключении к впн (который должен быть в публичной сети) чтобы через него были доступны связанные регионы.

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

Также, если много связей, имеет смысл посмотреть на
https://aws.amazon.com/ru/about-aws/whats-new/2019/12/aws-transit-gateway-supports-inter-region-peering/
Что-то достаточно свежее: Posted On: Dec 3, 2019

Отдельно настраивается резолвинг днс между зонами.

Автоматический переключатель входов, Блок распределения питания

Обновление к https://dragonflybsd.blogspot.com/2011/03/blog-post.html

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

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

Самая известная фирма это APC, у них такие устройства зовутся Rack ATS (Automatic Transfer Switch)
пример модели
AP4434

Вроде как RP серия у Cisco тоже то что нужно, но искать что-то по их продукции это боль.

Ну и есть много производителей типа CyberPower, у них дешевле, но зависит от того что подключать собираемся. Например
https://www.cyberpower.com/ru/ru/product/sku/pdu20swhviec10atnet#specification
И тут есть заявленное время переключения 8~12мс.

CloudFormation и установка ПО после настройки инфраструктуры


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

Обязательно начинаем с док
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-userdata

1) Простой баш скрипт где всё нужное. Быстро, но со своими особенностями вроде сложности обработки ошибок.
https://github.com/hashicorp/consul-ec2-auto-join-example/blob/master/templates/consul.sh.tpl#L5

понедельник, 13 января 2020 г.

Setup Consul via CloudFormation in aws

Во-первых, у консула есть автонастройка кластера на базе тэгов, подробнее тут
https://www.consul.io/docs/agent/cloud-auto-join.html#amazon-ec2

Во-вторых, информации как это лучше сделать вроде и море, но кусочек тут, кусочек там, а чуть что не так - надо долго гуглить что не так..
Некоторые действия нельзя сделать напрямую, нужно через некие промежуточные шаги, например у IAM (role, policy как часть role или отдельными блоками, profile)
https://aws.amazon.com/ru/premiumsupport/knowledge-center/cloudformation-attach-managed-policy/

aws cloudformation syntax

Несколько слов про синтаксис. cfn умеет yaml и json, и отличия там не такие и большие. Я бы сказал так: json больше подходит тем кто программировал(ует) на С(++) и/или пишет json руками, а для большинства удобнее будет yaml. Но это моё имхо. Или так: одним больше нравится считать пачки скобочек, другим - пробелы. Но без вменяемого IDE можно в обоих вариантах долго искать проблему.

Очень быстрое введение в CloudFormation

CloudFormation, он же cfn - система для быстрой настройки инфрастуктуры, более убогая версия TerraForm'a который умеет не только амазон. Но иногда нужен именно он.
Вариант первый: настройка через веб
https://docs.aws.amazon.com/en_us/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer-walkthrough-createbasicwebserver.html
Без инструкции будет тоже непонятно - есть какая-то форма, куда можно перетягивать квадратики, стрелочки... Поэтому читать.

Вариант второй - писать конфиг с нуля, руками.
Конфиг файл - файл yaml или json формата и состоит из 3 типовых частей:

  • Parameters
  • Resources
  • Output
(это основные, вообще их чуть больше: Description, Metadata, Mappings, Conditions, Transform)

Terraform vs CloudFormation

Очень вкратце - это платформы для настройки инфраструктуры. Создать VPC, сети, гейты, виртуалки, и связать это всё воедино.
Вообще, советую как минимум начинать с terraform - для амазона оно работает поверх cloudformation, но при этом позволяет достаточно просто перейти например на google cloud. Также по cfn очень мало где можно получить помощь, например есть чат https://t.me/aws_ru, так из 1290 человек что-то про cfn может сказать от силы человек 5. В IRC (freenode) мне пока вообще не довелось увидеть людей кто использует cfn. По терраформу народа гораздо больше.
Причём cfn хорошо работает в связке с ansible, в частности - можно настроить виртуалки через UserData, но любое изменение в этих скриптах и машины надо передеплоить, в этом плане ansible гораздо гибче. Но для задач вида "подключить репу, сформировать пару конфигов, запустить сервис" и подобное - сгодится.

А теперь что можно почитать:
https://technology.amis.nl/2019/05/27/differences-between-cloudformation-terraform-and-ansible-in-deployment-of-objects-in-aws/
https://blog.gruntwork.io/why-we-use-terraform-and-not-chef-puppet-ansible-saltstack-or-cloudformation-7989dad2865c
https://stuartsandine.com/terraform-vs-cloudformation-aws-resource-support/

https://www.youtube.com/watch?v=ALsSaPQI504
https://www.youtube.com/watch?v=sYoaOw7yGIc