Русский
Русский
English
Статистика
Реклама

Сертификаты

Введение в TLS для практиков Патриков (часть 2)

18.06.2020 12:21:50 | Автор: admin
Сегодня мы продолжаем разбираться, как устроен TLS и чем он может быть полезен Патрику и его друзьям. Первую часть истории можно прочитать тут.

Мы остановились на том, что сервер отправил свою часть TLS-handshake клиенту. Теперь клиент должен прежде всего проверить сертификаты и это самая тяжелая из вещей, которые ему обязательно надо сделать.



Certificate verification: chain


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




Сертификат подписывается ишьюером тем человеком, который этот сертификат выписал. Для того, чтобы считать этот сертификат правильным и все данные в нем верными, мы должны доверять этому ишьюеру то есть верить, что он всякую фигню не подписывает. Чтобы вся эта система работала, придумали такую концепцию как корневой сертификат (root certificate).

Root certificate


В принципе, это даже не обязательно должен был быть сертификат вполне хватило бы просто пары ключей. Потому что единственное, что нам от него надо это знать, что такому-то центру сертификации (Certificate Authority, CA) соответствует такой-то публичный ключ. Тогда мы можем проверить все сертификаты, которые он выписал, и если мы считаем, что CA не врет, значит, и в сертификатах всё верно. Так что на самом деле Root CA Certificate это такой же сертификат, как и все, просто самоподписанный.

Откуда появляется вера в центры сертификации как в хороших парней? Все просто договорились, что вот таким-то организациям можно доверять. У каждого клиента есть список соответствия CA и публичного ключа. Таким образом, каждый клиент знает, что есть вот такой чувак и ключ для него такой. И так это всё и проверяется. То есть просто записано, просто договорились, что верим.



Intermediate certificate


Следующий в цепочке Intermediate Certificate. Зачем он нужен? Дело в том, что в случае, если с Root CA Certificate что-то пошло не так, очень сложно его поменять. Центру сертификации нужно сделать новый приватный ключ, новый публичный ключ, всем это всё нужно обновить и так далее, это утомительно и это ломает всю секьюрити. И вообще, чем меньше мы работаем с машиной, на которой находится этот CA, тем меньше шансов, что этот приватный ключ украдут. Поэтому CA выписывают промежуточные сертификаты и уже с их помощью подписывают конечные (end-entity) сертификаты для вашего домена. Такая цепочка происходит очень часто и сертификат для нашего Патрика может быть подписан Губкой Бобом, а сертификат Губки Боба Мистером Крабсом (а Губка Боб работает на мистера Крабса, как мы знаем из мультика). То есть это, в принципе, может быть вообще одна организация. Для того, чтобы всё это провалидировать, клиенту нужно всю эту цепочку составить и проверить: взять ключик рутового сертификата, проверить, что промежуточный правильный и подпись валидна, потом взять ключик промежуточного сертификата и проверить конечный сертификат.

Цепочка должна присутствовать в списке сертификатов, которые сервер отсылает. По факту бывает всякое. Бывает, что не посылаются. Symantec, например, очень любил в бесплатные сертификаты не вставлять промежуточный. И поэтому в браузерах ничего не работало.

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



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

Basic Constraints


Еще одна штука, которая улучшает секьюрити (и с этим были серьезные баги до 2003 года в Internet Explorer): в промежуточных сертификатах в поле Basic Constraints должно быть написано CA: true, что означает, что этим сертификатам разрешено подписывать конечные сертификаты. Если этой штуки нет, то клиент при проверке цепочки должен сказать: я не могу принять этот промежуточный сертификат несмотря на то, что все подписи совпадают, в субъекте всё совпадает и т.д. Этой штуки нет до свидания. Internet Explorer не делал этой проверки и люди страдали из-за этого. Казалось бы, мелочь! Но тем не менее.

Еще раз, если кто не понял: если эту штуку не проверять, я могу получить сертификат от Lets Encrypt и потом этим сертификатом подписывать что угодно. И цепочка будет валидная.

CAPI и SCVP


Еще про верификацию и про цепочку. Есть маленькая особенность похвалим здесь Windows. Если сервер не отдал сертификат, в обычном (традиционном) подходе сертификат нам взять неоткуда, цепочки нет, всё сломалось. Так вот, в Windows есть такая штука как Certificate API, и она может достроить цепочку, взяв промежуточные сертификаты из своего хранилища. То есть, даже если сервер не передал, но у тебя в хранилище они есть, то цепочка построится и всё будет работать. Достаточно удобная штука, можно пересылать меньше информации, не уменьшая секьюрити.

Как эти сертификаты туда попадают? Либо залиты в хранилище, либо из сертификата, установленного на сервере. Например, в Plesk, если получить сертификат от Comodo и поставить его на домен в хранилище попадет промежуточный сертификат от Comodo.

Ну и еще люди, которым Windows нравится, придумали SCVP (Server-based Certificate Validation Protocol). В действительности не работает почти ни у кого и нигде в смысле глобально и массово, но как концепция есть. Более того, есть продукты, которые это делают, и даже в каких-то сетях это может быть настроено. Это сервис, который за тебя эту цепочку строит и частично даже проверяет, что удобно. Если там заявлена поддержка DPV (Delegated Path Validation), то он цепочку еще и провалидирует. То есть, клиенту надо этому сервису отправить сертификат и получить ответ продолжать сессию или рвать.


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

Итак, вот у нас получается такая вот цепочка.



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

Давайте проверять.

Certificate verification


Подпись


Про подпись уже упоминалось. Это вот пример, как это может выглядеть структурно: вот есть подпись, вот алгоритм этой подписи, мы берем какую-нибудь библиотечку, которая умеет с этим работать и проверяем, что тело сертификата подписано вот этой подписью и что всё действительно хорошо.



Дальше мы из этого сертификата достаем следующие поля и начинаем проверять их. Вы видите, что ишьюер у нас Global Sign, мы взяли его ключик и проверили, что подпись работает.

Не протух ли сертификат?


После этого нам надо проверить, что сертификат не протух это логично, ведь сертификаты выдаются на какое-то время.



Сейчас все certificate Authority договорились, что максимальный срок 2 года (раньше было 3). Еще дальше они хотят сделать 1 год, а некоторые радикалы хотят, чтобы был месяц. Lets Encrypt сейчас на 3 месяца выдает. А совсем радикальные радикалы хотят на каждое соединение новый сертификат выписывать. Почему некоторые люди так этим озабочены, станет понятно попозже, когда дойдем до пункта Не отозван ли сертификат?. Еще из интересного сертификат может быть выписан на будущее, так что надо проверять дату старта (по-хорошему).

Тот ли домен?


Тут всё понятно: если домен Wikipedia, а сертификат выписан на домен Plesk, то что происходит вообще? Кажется очевидным и капитанистым, но было несколько багов, когда клиенты это не проверяли. Сейчас, по счастью, такого бардака уже нет и стараются проверять все. Но опять-таки есть нюанс. Это SAN Subject Alternative Name.



Subject Alternative Name


В subject у нас может быть только один домен в нашем случае там, кстати, есть звездочка, про это попозже, это так называемый wildcard-сертификат. Итак, в субъекте доменное имя одно, но если хочется много (например, у нас есть сабдомены и/или разные имена типа plesk.ru, plesk.com и т.д., и хочется один сертификат на это всё иметь) тогда есть возможность всё это запихать в это поле SAN. Но нужно, чтобы это работало, во-первых, на сервере, во-вторых, на клиенте. Потому что, чтобы сервер отдал правильный сертификат, клиент должен ему как-то передать, куда конкретно он пришел. Это важно. И когда сервер выбирает сертификат, он должен знать Subject Alternative Name, потому что, может быть, имя домена там. За всё это отвечает такое расширение TLS, как SNI (Server Name Indication), на эту тему есть 4 RFC, короче, возможность есть, но не все это поддерживают. Например, у продуктов на GNU TLS с поддержкой SNI всё неплохо, а вот на OpenSSL многие не поддерживают. Кажется, это потому, что в GNU TLS это проще.

Ладно, мы, допустим, всё это умеем. Всё хорошо, всё проверили, пришли сюда.


Как мы должны проверять wild-card? Отдельный момент. Можно просто запомнить: звёздочка это не вообще звёздочка, а только один сегмент.

  • Если хотим на domain.com нам нужно без звездочки.
  • Если хотим на foo.bar.domain.com нам нужно *.bar.domain.com.

Поэтому wild card сертификат без SAN используется довольно редко. Хочется защитить не только сабдомены, но и сам домен а поле у тебя одно. С этим связаны интересные штуки, как определить, насколько сертификат хорош есть разные рекомендации. Например, Google Chrome форсит людей на то, чтобы даже если в субъекте у тебя прописан domain.com, то чтобы в SAN он тоже был, потому что они хотят проверять только поле SAN, а субъект не проверять. Но пока еще проверяют.

Еще интересный момент, что www.domain.com это отдельное имя, и если мы хотим по нему ходить, его надо защитить отдельно. Не у всех это в голове есть.

Ну и да, как уже говорилось, серверу надо найти сертификат для домена. Как работает SNI клиент в определенном заголовке передает, какой домен нужен. Поэтому это доступно даже на уровне TCP, где доменных имен нет в TLS есть, а в TCP (и в FTP) нет. Поэтому если мы делаем TLS, мы можем передать имя, но мало передать имя надо же серверу найти этот сертификат, и здесь есть разные нюансы с разными продуктами. Продукты на Windows нередко находят этот сертификат в хранилище сертификатов, а для продуктов на Linux нужно указывать конфиги, где брать эти сертификаты. И здесь тоже есть разные проблемы. Мы недавно чинили SAN в Postfix там может быть очень простая вещь мы, например, указываем, что для domain.com сертификат такой, а человек приходит c mail.domain.com. А mail.domain.com это не domain.com. Всё, сервер не может найти сертификат, всё развалилось. То есть кому-то надо указывать, кто-то сам находит. Для тестирования и разработки это важная вещь в аспекте SAN.

Ок, пойдём дальше.

Тот ли тип использования?


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



Сертификаты бывают разные. То есть, если в Key Usage не указаны вот эти вот два параметра, то это по идее! должно влиять на то, как клиент с этим работает.

Key agreement это как раз когда мы выписываем сеансовые ключи и договариваемся о них. Обычно вся эта коммуникация подписывается или шифруется вот этим вот публичным ключом, который чуть выше. Но если в key usage не прописан key agreement, то это означает, что ишьюер этого сертификата запрещает использовать этот сертификат для вот этого назначения. Сейчас на практике это почти не встречается, то есть эти вещи у большинства сертификатов одинаковые, но тем не менее в принципе могут быть и другие. И бывает, что сертификат НЕ подходит для чего-то. Для чего он подходит написано здесь. Клиент должен это проверять. Кстати, нередко бывает, что в extended key usage вот это вот TLS Web Server Authentication у промежуточных сертификатов отсутствует.

Не отозван ли сертификат?


Самая интересная вещь мы дошли до нее, ура! Самая прикольная, самая неработающая :)

Если говорить кратко, то сейчас здесь во всей инфраструктуре TLS очень большие проблемы, потому что: не работает ничего. И эту проблему как раз и хотят решать тем, чтобы срок действия сертификата сделать очень маленьким. Когда нужно отзывать сертификат? Чаще всего когда ваш приватный ключ утек. Ваш приватный ключ утек вы попали. Надо сертификат отозвать, потому что если не отозвать, тот кто украл ваш ключ, сможет подсовывать клиентам ваш сертификат и представляться вами. Надо сказать: чуваки, я поменял свой ключ тот сертификат не действителен!

Если сделать время действия сертификата очень маленьким, то в принципе можно не отзывать, а подождать, когда он кончится. Отсюда все эти экстремальные предложения с минутами и часами. Ну, а если у тебя сертификат на 3 года, а ключ украли на второй день то три года кто-то сможет представляться тобой.

Как же проверить, отозван сертификат или нет?

Certificate Revocation List


Изначально сделали что (и это до сих пор работает, и это до сих пор по-хорошему надо проверять): Certificate Revocation List. То есть тупо список сертификатов (их серийные номера с ишьюерами), которые отозваны. Ну, вы представляете, сколько за время существования SSL и TLS было отозвано сертификатов очевидный минус в том, что список здоровый. Для того, чтобы понять, отозван сертификат или нет, тебе этот список надо откуда-то скачать, а значит, надо доверять тому, у кого качаешь, ведь там могут подменить, потом себе вгрузить, распарсить и проверить, что вот этого сертификата, который ты проверяешь, там нет то есть посмотреть тебе надо всё. Поэтому это всё медленно, а еще это единая точка отказа. Есть специальные атаки, когда вот этот URL, по которому надо проверять CRL, просто DDOS-ят, клиенты не могут скачать список и расценивают ошибки скачивания как всё хорошо (нет списка значит, всё хорошо).



Поэтому этот механизм считается устаревшим, но в стандартах всё еще есть и по-хорошему надо бы его использовать. Google Chrome на него забил уже давно, Mozilla тоже.

OCSP


Есть другая штука OCSP. Это примерно то же самое, только вместо того, чтобы качать файлик, делается специальный запрос на то, чтобы та сторона сказала тебе отозван сертификат или нет. То есть, клиенту стало проще, а вот чуваку на той стороне проще не стало, потому что вместо того, чтобы просто отдавать список, надо по этому списку проверять запрос и говорить да или нет. Если основываться на CRL, другого варианта, кроме этого, особо-то и нет и это действительно лучше, чем чистый CRL. Тем не менее, Chrome забил и на это, остальные пока используют.

OCSP stapling


Это примерно в ту же степь, но тут мы уже начинаем уходить от структуры Certificate Authority. То есть возлагаем эту проверку на сервер. Как это работает: сервер периодически ходит по этому OSCP URL-у и говорит: OCSP-resolver, посмотри-ка, вот этот мой сертификат в отозванных или нет?. OCSP-resolver отвечает подписанным ответом, наш сервер его запоминает, и когда клиент приходит, ему отдаётся этот ответ. То есть у клиента есть подписанный ответ и в нём написано, что всё хорошо. Из-за того, что серверов меньше, чем клиентов и сервер может на какое-то время это кэшировать, нагрузка на всех становится меньше.



Тут есть тоже некоторые проблемы: текущий механизм это только на один сертификат, а у нас цепочка (и это важно). А еще, из-за того, что мой сервер отвечать на это не обязан, клиент не может рассчитывать на то, что OSCP-stapling точно будет. И поэтому отказаться ни от CRL, ни от OCSP не получается просто потому, что серверы не обязаны опрашивать и отвечать. Ну и еще один аспект: если в вебе с этим нормально, то в почте всё плохо, а в FTP даже слов таких не знают.

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



Вот это всё вместе теоретически может начать работать, но пока еще мало распространено.

Google и Mozilla, так как им всё это не нравится, сделали свой CRL. И зашили его в браузер. Огонь вообще! Это работает быстро, ну и на этом все плюсы заканчиваются. Для того чтобы не помереть, они не запихивают в него DV-сертификаты. То есть если DV-сертификат отозван, они считают ну и ладно. Так что если DV-сертификат отозван и при этом нет OSCP-степлинга, Chrome об этом не скажет он посчитает этот сертификат нормальным. На самом деле, правильно пользоваться OSCP-степлингом и OCSP Must Staple флагом в сертификате. С ним тоже не всё просто большинство генераторов CSR сейчас не умеют его указывать, а большинство Сertificate Authority не умеют его выписывать.

Сertificate Transparency


Итак, всё хорошо, но Google не был бы Google, если бы не придумал еще одну технологию конкретно для себя. Она называется Сertificate Transparency. Откуда что идет: Google очень беспокоится о том, чтобы кто-нибудь не выписал плохой сертификат на него самого чтобы именно Google не пострадал от того, что кто-то там выписывает какие-то нехорошие сертификаты. И вот с помощью Сertificate Transparency каждый владелец домена (и вообще кто угодно) может посмотреть, какие сертификаты на этот домен были выписаны. Дальше он может этот сертификат взять и с ним что-нибудь сделать. Например, проверить, хороший он или нет. Ну и возбудиться (или не возбудиться).



Это не только технология, но и набор процессов. То есть Google говорит: ребята, вот у нас есть Сertificate Transparency, мы в него записываем только нормальные сертификаты такие, где цепочка есть, цепочка правильная и всё нормально. Мы можем время записи Сertificate Transparency Log запихать в сертификат, чтобы клиент мог четче посмотреть, что вот этот сертификат в Transparency Log должен быть тогда-то. Мы гарантируем, что это вот эта штука не редактируема обратно (из-за того, что блокчейн) ну то есть нельзя взять и подменить старые записи, можно только добавлять новые. И давайте, ребята, кто-нибудь из вас будет периодически ходить по этому логу, и проверять, что там всё нормально, а если что-то не так, говорить нам и мы будем это править. А другие ребята пусть держат у себя всё это, потому что надо, чтобы было много мощностей на вот эту вот штуку.

Сейчас Сertificate Transparency поддерживает DigiCert, недавно начал поддерживать Lets Encrypt, а вот из валидаторов практически никого нет, Google сам всё это делает. Когда всё это заработает в полную силу и валидаторов станет больше, то плохих сертификатов должно стать меньше, потому что кто-нибудь будет возбуждаться. На картинке показан HTTP-заголовок Excpect-CT, его можно отдать и клиент будет обязан сходить в Сertificate Transparency и проверить, что вот этот сертификат в нем указан. А из-за того, что там еще есть timestamp, сложнее становится запихать плохую запись в Сertificate Transparency. Но, опять-таки это не очень помогает с Revocation, можно сказать, вообще не помогает. Это только про то, что все сертификаты, выписанные на домен, владелец домена может посмотреть и возбудиться.

Вот такая вот штука. По большому счету хайпа много, но ничего она не решает. А что решает (каким-то образом), но не используется это DANE.

Дополнительная защита


Вся структура TLS является уязвимой в одной точке точке доверия, то есть вот эти вот сертификационные центры, рутовые сертификаты если с ними что-то не то, всё разлетелось. Есть по сути две попытки с этим как-то бороться.

DANE


Первая попытка, собственно, DANE хранить информацию о сертификатах в DNS.


Почему это должно работать потому что DNSSEC. Certificate Authority здесь могут вообще в принципе отсутствовать, можно даже без них. Сейчас DANE используется примерно для того же, для чего HPKP (следующий пункт рассказа) для того, чтобы в базе данных DNS держать информацию о том, какой публичный ключ должен быть у сертификата. То есть это, по существу, еще одна связочка. Можно указать: мой публичный ключ такой-то, и когда клиент получит сертификат и там посмотрит ключ, он сможет из DNS посчитать хэш и если не совпадет, заорать меня хакнули. Так что, чтобы в случае с DANE украсть сертификат, надо еще и на стороне DNS что-то сломать. В этом плане эффект есть. В Голландии, например, DANE обязателен для сервисов, которые предоставляют почту и связаны с госструктурами.



Давайте посмотрим на запись детальнее. Здесь есть разные поля: можно указать, что сертификат должен быть выписан именно этим Authority это уже немного помогает. Принцип тот же, что и у САА, только уже после выписки. Это не зависит от того, смотрит ли ишьюер в САА запись или нет. В DANE написано: клиент обязан посмотреть, что сертификат, который он получил, выписан определенным Certificate Authority, и если это не так ничего не выйдет. Всё зависит только от клиента и не зависит от CA. Это плюс.

Из остального остановимся на Domain issued certificate. В принципе, если бы всё хорошо работало (здесь ключевая проблема с DNSSEC), то мы бы могли указывать в своей DNS-записи свой сертификат и не зависеть ни от кого. То есть, если я владею доменом, сгенерировал хотя бы самоподписанный сертификат, указал его вот сюда, и DNSSEC работает нормально, то клиент доверяет моей DNS-записи и сертификат берет оттуда. Всё, CA не нужны. Бизнес на сертификатах рушится, денег никаких нет :)

Однако это всё не работает. Во-первых, есть EV-сертификаты, для которых всё-таки хочется проверить организацию. Во-вторых, проблема доверия уходит с Certificate Authority на инфраструктуру DNSSEC, которая считается недостаточно рабочей, потому что она мало распространена, на нее все забили, а еще там тоже есть уязвимости.

В общем, спорная вещь, одно меняем на другое, из-за этого теряем EV-сертификаты. Возможно, поэтому это не слишком распространилось.

HPKP


Дальше еще есть одна интересная вещь, называется HPKP.



Идея на картинке: мы в HTTP-заголовке отдаем собственно хэши сертификатов, которые клиент должен проверить, и если публичный ключ сертификата имеет другой хэш (то есть его нет среди перечисленных) до свидания. Google в HPKP разочаровался и Chrome это не поддерживает. На этом можно закончить, хотя вообще выглядит интересно если я знаю, какие у меня есть сертификаты, мне очень легко этот заголовок отдать, и это должно повышать секьюрити по идее.

Policy




Как мы уже знаем, если браузер смотрит в это поле и находит там определенные сочетания циферок и буковок, то он должен понять, что это EV-сертификат и, возможно надо сделать дополнительные вещи. Вот тут у нас указан Global Sign Repository и иногда браузер должен сходить по указанному там адресу и получить ответ, что всё хорошо. Это в основном работает для EV-сертификатов, для OV браузеры это часто просто игнорируют, ну и в DV этих полиси-то и нет собственно. Для чего это надо вам просто для информации.

Ответ клиента


Итак, Патрик проверил сертификаты и начинает отвечать Губке Бобу.



Если у клиента просили сертификаты, он их отдает. Дальше он отдает информацию для того, чтобы сделать ключики так же, как сервер, clientKeyExchange. Поле CertificateVerify неинтересная инфа на тему как валидировать сертификат, в TLS 1.3 она и выглядит-то уже по-другому, потому что не сильно нужна.

После этого клиент переходит на шифрованный канал и посылает сообщение Finished я готов к шифрованному каналу. Сервер проверяет это сообщение что там всё нормально, как договорились, что оно расшифровывается, что не успели на данном этапе ничего подменить и это всё еще Патрик, тоже переходит на шифрованный канал и отдает свое Finished-сообщение, которое в свою очередь проверяет клиент. И после этого идет общение уже данными приложений по шифрованному каналу.



TLS-handshake full vs resumed


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

Session ID


До TLS 1.3 для решения этой проблемы использовались укороченные сессии. Когда сервер отвечает клиенту, он отдает ему Session ID. Если у клиента этот Session ID тоже есть, он отсылает его серверу и вот эта часть, которая в рамочке, пропускается. Потому что сервер запоминает контекст всей этой штуки и продолжает так, как будто это уже произошло. Сессионный ключ выбран, и клиенту не надо проверять сертификат, потому что он есть в этом сессионном ключе. Если окажется, что сертификат там какой-то другой, то выбранный сессионный ключ не будет работать и клиент просто не сможет расшифровать сообщение сервера.



Так это всё работает. Это побыстрее, но тоже есть проблемы, возрастает нагрузка на сервер, ну и есть атаки с перехватом Session ID. Потому что этот Session ID идет по открытому каналу.

Session ticket


Еще для ускорения можно использовать Session Ticket это в принципе то же самое, что и Session ID, только передается зашифрованный контекст, а не циферка, которую можно украсть. Бывает, что сессию установить не удалось, тогда придет алерт. С ними тоже связаны атаки на TLS, потому что алерты имеют определенную структуру и определенный размер. Если алерт произошел на этапе, когда уже трафик идет зашифрованным, то из-за того, что алерт понятной структуры и злоумышленник может знать, что ему в этом алерте отвечают задача расшифровывания становится сильно проще. Поэтому в TLS 1.3 это уже не используется.

Reinit


Что еще бывает в TLS-handshake в принципе? Иногда серверу бывает нужно инициализировать сессию повторно чаще всего тогда, когда сертификат клиента был не нужен и вдруг стал нужен. Тогда сервер говорит: давай перезапустим. Ну и клиент может сказать еще раз Client Hello. В TLS 1.3 это тоже убрали, потому что тоже были атаки атаки были везде!



Что в TLS 1.3?


Все упомянутые трудности решаются использованием TLS 1.3. Половины проблем вообще нет, всё проще, красивее, всё прям отличненько. Но TLS 1.3 еще распространен маловато. Самые важные отличия TLS 1.3 (их очень много, они везде, поэтому только самые важные):

  • Плохие шифры удалены, остались только хорошие. Инициализировать сессию TLS 1.3 на плохих шифрах не получится. Всё дело в новых cipher suites: тут и другие алгоритмы обмена сеансовых ключей, и так называемый HMAC не будем углубляться в подробности, потому что Патрик устал. Вкратце: раньше подпись каждого TLS-пакета шла отдельно. На это были атаки, потому что было известно, какой там контент находится. Сейчас ее запихали вовнутрь (режим AEAD), и в TLS 1.3 по-другому быть не может, соответственно, мы избавились от таких атак.
  • Handshake стал короче нет старых сообщений, нет старых расширений, нет возможности по каким-то странным штукам обменяться ключиками. То есть, он тупо короче количественно даже самый полный TLS 1.3 handshake короче, чем в TLS 1.2.
  • Переход на шифрованный канал происходит почти что сразу. Для этого используются разные ключики: да, пока не договорились о хороших ключиках, оптимальных, мы используем какие попало, но канал уже шифрованный. То есть hello hello и пошло всё зашифрованное. Из-за этого сложнее всё это ломать.
  • Всё регламентировано, больше не надо пытаться менять размеры пакетов, забивая их ноликами, чтобы сложнее было расшифровывать.
  • Своя пара ключей на каждую сеансовую фазу. Сеансовые ключи меняются: пока мы ни о чем не договорились они такие, договорились о более крутых они более крутые, сертификаты проверили и всё хорошо еще другие ключи. В итоге их много, они усложняются и очень трудно это всё поломать. Еще одна важная вещь, почему это быстрее: Early Data (она же 0-RTT, Zero Round Trip Time) это когда у тебя в TLS-handshake посылается полезная инфа ну например GET-запрос. То есть нет такого, что поговорили-поговорили и только потом посылаем что-то отдельным потоком. Сразу же в handshake идет запрос. Как только сервер его получил, он начинает его обрабатывать, отдает клиенту свои данные, сертификат и пока клиент проверяет, сервер уже готов отдать. И может даже в TLS-handshake и отдать иногда.
  • Есть pre-shared key, то есть клиент с сервером могут договориться и сохранить сеансовые ключи для последующих соединений. И, соответственно, когда происходит handshake таких вот договорившихся клиентов, на этап выбора ключей время не тратится. Долго объяснять, как это сделано криптографически, но тех атак, которые были на Session ID, вот в этом месте сейчас нет (что хорошо). Всё стало безопаснее и быстрее.

Основная проблема, что поддержка TLS 1.3 она во всех браузерах, которые актуальны, есть, но не во всех по дефолту включена. Например, в Safari нет (но там очень легко включить), Google Chrome и Mozilla Firefox уже по дефолту поддерживают TLS 1.3. Ngnix с TLS 1.3 без проблем, в Apache есть нюансы, а вот с почтовыми клиентами хуже там только Exim молодец, а остальные не очень.

В общем, это наше будущее, там всё получше и попроще, самое главное. Но пока оно еще не везде наступило.

Как всё это тестить?


Инструментов для тестирования много, большинство из них не очень, вот эти плюс-минус ничего:

  • ssldecoder.org посмотреть поля сертификата
  • www.ssllabs.com/ssltest протестить TLS домена (нужная внешняя машина)
  • ssl-config.mozilla.org генератор конфигов сервисов с хорошими настройками TLS
  • crt.sh поиск по Certificate Transparency. Полезно посмотреть, когда есть проблемы у клиентов, например клиент говорит, что уже пятый раз выписывает сертификат и происходит какая-то фигня. Возможно это поможет, например валидити период не тот, тогда можно угадать.
  • www.checktls.com/TestReceiver сервис проверки TLS на почте (нужна внешняя машина)
  • certificatetools.com крутая штука для генерации CSR, изменения полей сертификата, проверки OCSP и прочих вещей. Можно скормить готовый сертификат, запихнуть какое-то поле, которое тебе надо, и создать еще один сертификат. Соответственно, подпись будет уже твоя, но если тебе надо проверить, как себя ведет софт, как он реагирует на определенное поле в сертификате, ты можешь без всяких CSR-ов выписать такой само-подписанный сертификат. Таким образом можно поиграться с полями.
  • www.immuniweb.com/ssl подробный сканер
  • www.wireshark.org поддерживает даже то, чего еще нет в стандартах
  • www.feistyduck.com/books/openssl-cookbook cookbook по OpenSSL


Маленький бонус


То, что не влезло.



На картинку тоже не всё влезло тема очень большая, но на практике можно фокусироваться таким образом, чтобы на любом уровне понимать идею в целом и смочь разгрести что происходит, понять, что вам нужно доучить, что сейчас конкретно нужно узнать и всё вот это. Эта картинка про ключевые слова. Из литературы можно рекомендовать очень крутую статью на русском языке Ключи, шифры, сообщения: как работает TLS прочитать целиком вряд ли удастся, но в качестве справочника пригодится. Открыл, нашел что надо, почитал, ключевые слова узнал, пошел в википедию и на английском прочитал (на русском почему-то плохо написано). На английском написано отлично: идея, зачем, почему, ссылочки. Не знаешь, что такое HSTS иди в википедию, там будет ссылочки на статьи для Патриков, то есть чайников. Еще на RFC, но это читать невозможно. Общий смысл станет понятен даже из самой статьи в Википедии.

Вот и всё! Вы молодцы :)
Подробнее..

GlobalSign выпустила первый в мире кроссплатформенный агент для управления сертификатами под Windows, macOS и Linux

28.01.2021 02:19:40 | Автор: admin


19 января 2021 года компания GlobalSign объявила о выходе AEG 6.4 новой версии шлюза автоматической регистрации Auto Enrollment Gateway, вместе с которым представлена маленькая, но уникальная программка: кроссплатформенный агент для автоматической выдачи и управления сертификатами под Windows, Mac OS и Linux. Компания заявляет, что это первое такое предложение от любого удостоверяющего центра в мире.

Агент регистрации


Кроссплатформенный агент регистрации небольшая программа, которая устанавливается на устройстве и использует протокол ACME или SCEP для связи с AEG. Во многих случаях агент также обеспечивает соблюдение определённых отраслевых правил или национальных нормативных актов. Кроме того, агент устраняет барьеры для S/MIME, поскольку работает на любой платформе и операционной системе, что также повышает масштабируемость. Например, если из компании увольняется сотрудник, то его ключи автоматически архивируются.

Агент регистрации легко устанавливается на любом клиенте или сервере Windows, macOS и Linux. Утилита помогает устанавливать политики управления сертификатами и управлять с помощью интуитивно понятной панели мониторинга AEG.



Кроме того, агент автоматически выдаёт и контролирует сертификаты. Это великолепно масштабируемый метод развёртывания сертификатов на устройствах, машинах, клиентах S/MIME и серверах организации.

Установка агентов на своих конечных точках даёт организации больший охват и контроль над всей своей сетью, говорит Лила Ки, генеральный директор отдела операций в Северной и Южной Америке GlobalSign. Это также означает, что пользователям и администраторам больше не нужно полагаться на сложные методы регистрации сертификатов, что в конечном итоге улучшает управление сертификатами. Мы действительно ставим последнюю точку в автоматизации этого процесса. AEG 6.4 идеально подходит для организаций, которые хотят начать или оптимизировать удалённую работу, обеспечить безопасность сетей BYOD и автоматизировать функции PKI, которые потребляют время и ресурсы в ручном управлении.

Что такое Auto Enrollment Gateway


Auto Enrollment Gateway это полностью автоматизированное PKI-решение, которое интегрирует PKI непосредственно с Active Directory, поэтому в среде Windows можно автоматизировать выпуск сертификатов и управление ими без необходимости поддерживать собственный удостоверяющий центр. Поддержка протоколов SCEP и ACME v2 расширяет использование сертификатов за пределы домена Windows, позволяя автоматизировать сертификацию для серверов Linux, а также мобильных, сетевых и других устройств.



Передавая услуги по шифрованию и управлению сертификатами доверенному удостоверяющему центру, компания снижает риски, связанные с управлением и поддержанием работы собственной инфраструктуры PKI.

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

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

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

  • Вход в систему с помощью смарт-карт
  • Электронные подписи в документах Microsoft Office,
  • Подпись кода
  • Защита электронных сообщений
  • SSL/TLS
  • Система шифрования данных Encrypted File System (EFS) на уровне файлов в операционных системах
  • Аутентификация пользователей
  • Аутентификация устройств
  • Мобильная аутентификация
  • и т.д.

Шлюз AEG идеально подходит для любой компании с более чем 500 сотрудниками и/или устройствами, а также для тех, кто использует Microsoft Active Directory. Управление PKI и автоматизация особенно востребованы в нынешних условиях, которые требуют от сотрудников удалённой работы.

AEG 6.4 также реализует опции безопасности, в которых сейчас нуждаются компании: S/MIME для безопасной электронной почты, удалённая сетевая аутентификация и инструменты для управления всем этим. Это снижает нагрузку на IT-отдел, экономит время и деньги ресурсов, а также значительно повышает уровень безопасности компании.
Подробнее..

Перевод Примеры грамотного применения SSH-шаблонов

17.02.2021 20:19:33 | Автор: admin


SSH-сертификаты очень мощный инструмент. Первоначально в удостоверяющем центре step-ca мы реализовали только минимальный набор функций для аутентификации по сертификатам пользователя и хоста. Затем добавили шаблоны сертификатов X.509, а ещё в августе прошлого года и SSH-шаблоны, в версии 0.15.2. Наконец, мы задокументировали эту функцию и готовы о ней рассказать.

Шаблоны для сертификатов SSH действуют аналогично шаблонам X.509: это JSON-файлы, написанные в Go text/template. Они применяются для настройки SSH-сертификатов, которые выдаёт step-ca. Давайте посмотрим, что представляют собой эти шаблоны и как их можно использовать.

По умолчанию шаблон пользовательского SSH-сертификата выглядит так:

{"type": {{ toJson .Type }},"keyId": {{ toJson .KeyID }},"principals": {{ toJson .Principals }},"extensions": {{ toJson .Extensions }},"criticalOptions": {{ toJson .CriticalOptions }}}

А вот SSH-сертификат, выданный по этому шаблону:

$ step ssh inspect id_ct-cert.pubid_ct-cert.pub:        Type: ecdsa-sha2-nistp256-cert-v01@openssh.com user certificate        Public key: ECDSA-CERT SHA256:iczSh1XiBBE36yfJcDidgp6fqY3qWx1RtEwFfAN9jDs        Signing CA: ECDSA SHA256:MKwRQ/SDKk/pCJbbCk5bfhZACjSjv7uZXLyc5n4Wx6k        Key ID: "carl@smallstep.com"        Serial: 2831574724231262409        Valid: from 2020-11-17T16:48:11 to 2020-11-18T08:49:11        Principals:                carl                carl@smallstep.com        Critical Options: (none)        Extensions:                permit-X11-forwarding                permit-agent-forwarding                permit-port-forwarding                permit-pty                permit-user-rc

Он позволяет юзеру carl (или carl@smallstep.com) пройти аутентификацию на любом SSH-хосте, который доверяет моему SSH CA. Сертификат включает в себя некоторые основные расширения:

  • permit-x11-forwarding: Разрешает переадресацию X11 (с помощью ssh -X) для запуска удалённых программ X11 на локальном дисплее.
  • permit-agent-forwarding: Разрешает переадресацию агента (с помощью ssh -A) для пересылки ключей из локального агента SSH на удалённый хост (подробнее про агента SSH см. здесь).
  • permit-port-forwarding: Разрешает переадресацию портов (туннель) с локального на удалённый порт (ssh -L) или с удалённого на локальный (ssh -R).
  • permit-pty: Очень важное расширение. Если хотите открыть интерактивную сессию в консоли, хост должен выделить вам pty (псевдо-tty). В противном случае не предусмотрено никакой интерактивности. Например, для проверки SSH-аутентификации на GitHub можно запустить ssh -T git@github.com (-T отключает запрос на pty).
  • permit-user-rc: Запуск личного RC-файла после подключения (находится в ~/.ssh/rc на удалённом хосте).

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

Примеры шаблонов сертификатов


Внесём несколько изменений в дефолтный шаблон.

Запрещаем переадресацию агента и портов

Если пользователи подключаются к внутренним хостам через хост-бастион, то хорошо бы запретить перенаправление портов по соображениям безопасности. Вы же не хотите, чтобы юзеры перенаправили трафик с продакшн-сервера MySQL на свой localhost. Так же и переадресация агента сопряжена с риском для безопасности. Вот шаблон, который просто удаляет эти два расширения из сертификатов SSH:

{"type": {{ toJson .Type }},"keyId": {{ toJson .KeyID }},"principals": {{ toJson .Principals }},"extensions": {           "permit-x11-forwarding": "",           "permit-pty": "",           "permit-user-rc": ""  },"criticalOptions": {{ toJson .CriticalOptions }}}

Встраиваем директиву force-command

ForceCommand это серверная директива конфигурации SSHD, которая вместо интерактивного терминала запускает на хосте альтернативную команду. Но с тем же эффектом можно встроить force-command прямо в сертификат в раздел Critical Options:. Может пригодиться для служебных аккаунтов, которым необходимо выполнить только одну команду, например, запустить задание в удалённой системе.

Ограничиваем соединения по адресам

Чтобы ограничить область использования сертификата, в него можно встроить список разрешённых IP-адресов (блоков CIDR).

Вот шаблон сертификата, который использует и source-address, и force-command.

{"type": {{ toJson .Type }},"keyId": {{ toJson .KeyID }},"principals": {{ toJson .Principals }},"extensions": {{ toJson .Extensions }},"criticalOptions": {"force-command": "echo \"Hello World\"","source-address": "10.20.30.0/24,1.1.1.1/32"}}

Это нормальный пример, но здесь список IP жёстко зафиксирован и не изменяется. А нам обычно хочется использовать разные списки адресов для разных пользователей. Давайте попробуем

Вставляем разные значения для разных юзеров

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

Для этого в step-ca можно через поставщика OpenID Connect (OIDC) настроить провайдера OAuth на добавление к токену нестандартных требований (custom claim), содержащих блоки адресов CIRD, которые мы хотим добавить в сертификат этого пользователя.

Поставщик OIDC представляет собой идеальный способ выдачи SSH-сертификатов в step-ca. В статье DIY Single Sign-On for SSH я рассказывал, как настроить SSH CA, чтобы он выдавал краткосрочные SSH-сертификаты по ID-токенам от доверенного провайдера OAuth. Если step-ca настроен как доверенный клиент OAuth, он будет считывать поле email из токена ID и извлекать оттуда список участников SSH-сертификата (например, по полю carl@smallstep.com сгенерируются сертификаты для carl и carl@smallstep.com).

Но OIDC позволяет через шаблоны считать из токенов ID и другие поля. Вот где начинается настоящая магия. Таким образом, добавляем в каталог пользователей на стороне провайдера идентификации отдельное поле source_address и отражаем его в нашем ID-токене. Затем через шаблон SSH можно ввести значение из токена в сертификат. Вот шаблон:

{"type": {{ toJson .Type }},"keyId": {{ toJson .KeyID }},"principals": {{ toJson .Principals }},"extensions": {{ toJson .Extensions }},{{ if .Token.source_address }}"criticalOptions": {"source-address": "{{ .Token.source_address }}"}{{ else }}"criticalOptions": {{ toJson .CriticalOptions }}{{ end }}}

Аутентификация на GitHub по сертификату

Рассмотрим ещё один пример custom claim. С помощью GitHub Enterprise Cloud или GitHub Enterprise Server можно настроить GitHub на использование SSH-сертификатов. В частности, GitHub будет доверять вашему центру сертификации SSH. Но чтобы всё заработало, нужно создать для каждого пользователя отдельный SSH-сертификат с расширением login@github.com, в котором прописывается имя пользователя на GitHub. С помощью этого расширения сертификат аутентифицирует пользователя на GitHub Enterprise. И это здорово: один и тот же сертификат позволяет и подключиться к вашему серверу по SSH, и запушить код на GitHub.

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

{"type": {{ toJson .Type }},"keyId": {{ toJson .KeyID }},"principals": {{ toJson .Principals }},"criticalOptions": {{ toJson .CriticalOptions }},{{ if .Token.ghu }}"extensions": {  "login@github.com": {{ toJson .Token.ghu }}}{{ else }}"extensions": {{ toJson .Extensions }}{{ end }}}

Для использования шаблона нужно добавить к токенам идентификации OIDC индивидуальное требование ghu (GitHub Username). Давайте подробно рассмотрим, как создать этот custom claim с помощью вашего провайдера OAuth.

Регистрация заявления у провайдера идентификации

Не все провайдеры идентификации поддерживают индивидуальные требования, но если поддержка всё-таки есть, то процесс довольно похож. Вот как это делается с помощью Okta:

  1. Добавьте приложение OAuth в Okta и установите доверие к нему у поставщика OIDC в step-ca, как описано в статье DIY SSO for SSH.


  2. Добавьте новое поле в каталог пользователей Okta (например, GitHub Username)
  3. Добавьте к OIDC-токену индивидуальное требование, например, с сокращённым названием ghu
  4. Теперь заполняем поле для тестового юзера и проверяем требование. В Okta есть инструмент тестирования токена ID. Или можно использовать step для проверки всего потока OAuth:

    OIDC_ENDPOINT="http://personeltest.ru/aways/[your organization].okta.com/oauth2/default/.well-known/openid-configuration"CLIENT_ID="[your OAuth client ID]"CLIENT_SECRET="[your OAuth client secret]"step oauth --oidc --provider $OIDC_ENDPOINT \    --client-id $CLIENT_ID --client-secret $CLIENT_SECRET \    --listen=":10000" --bare |step crypto jwt inspect --insecure
    

  5. Наконец, настройте step-ca для использования этого шаблона. Конфигурация поставщика должна ссылаться на файл шаблона:

    {  "provisioners": [    {      "type": "OIDC",      "name": "Okta",      "clientID": "[your OAuth client ID]",      "clientSecret": "[your OAuth client secret]",      "configurationEndpoint": "https://[your organization].okta.com/oauth2/default/.well-known/openid-configuration",      "listenAddress": ":10000",      "options": {        "ssh": {            "templateFile": "templates/certs/ssh/github.tpl"        }      }    },      ...  ]}
    

Что дальше


Мы добавили в документацию раздел о шаблонах SSH, где более подробно рассматриваются все параметры и переменные.

Если есть вопросы не стесняйтесь задавать.
Подробнее..

Ломаем и чиним Kubernetes

05.02.2021 20:16:55 | Автор: admin

Kubernetes отличная платформа как для оркестрации контейнеров так и для всего остального. За последнее время Kubernetes ушёл далеко вперёд как по части функциональности так и по вопросам безопасности и отказоустойчивости. Архитектура Kubernetes позволяет с лёгкостью переживать сбои различного характера и всегда оставаться на плаву.

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


Итак приступим. Основной control-plane Kubernetes состоит всего из нескольких компонентов:

  • etcd - используется в качестве базы данных

  • kube-apiserver - API и сердце нашего кластера

  • kube-controller-manager - производит операции над Kubernetes-ресурсами

  • kube-scheduller - основной шедуллер

  • kubelet'ы - которые непосредственно и запускают контейнеры на хостах

Каждый из этих компонентов защищён набором TLS-сертификатов, клиентских и серверных, которые используются для аутентификации и авторизации компонентов между ссобой. Они не хранятся где-либо в базе данных Kuberentes, за исключением определенных случаев, а представлены в виде обычных файлов:

# tree /etc/kubernetes/pki//etc/kubernetes/pki/ apiserver.crt apiserver-etcd-client.crt apiserver-etcd-client.key apiserver.key apiserver-kubelet-client.crt apiserver-kubelet-client.key ca.crt ca.key CTNCA.pem etcd    ca.crt    ca.key    healthcheck-client.crt    healthcheck-client.key    peer.crt    peer.key    server.crt    server.key front-proxy-ca.crt front-proxy-ca.key front-proxy-client.crt front-proxy-client.key sa.key sa.pub

Сами компоненты описаны и запускаются на мастерах как static pods из директории /etc/kubernetes/manifests/

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

Основная схема выглядит примерно так:

(стрелочки указывают на связи клиент --> сервер)(стрелочки указывают на связи клиент --> сервер)

Для коммуникации им нужны TLS-сертификаты, которые в принципе можно вынести на отдельный уровень абстракции и полностью довериться вашему инструменту деплоя, будь-то kubeadm, kubespray или что либо ещё. В этой статье мы разберём kubeadm т.к. это наиболее стандартный инструмент для развёртывания Kubernetes, а также он часто используется в составе других решений.


Предположим, что у нас уже есть задеплоенный кластер. Начнём с самого интересного:

rm -rf /etc/kubernetes/

На мастерах данная директория содержит:

  • Набор сертификатов и CA для etcd (в /etc/kubernetes/pki/etcd)

  • Набор сертификатов и CA для Kubernetes (в /etc/kubernetes/pki)

  • Kubeconfig для cluster-admin, kube-controller-manager, kube-scheduller и kubelet (каждый из них также имеет закодированный в base64 CA-сертификат для нашего кластера /etc/kubernetes/*.conf)

  • Набор статик-манифеств для etcd, kube-apiserver, kube-scheduller и kube-controller-manager (в /etc/kubernetes/manifests)

Чиним control-plane

Чтобы не было недоразумений, давайте также убедимся что все наши control-plane поды также остановлены:

crictl rm `crictl ps -aq`

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

Давайте начнём с восстановления etcd, так как если у нас был кворум (3 и более мастер-нод) etcd-кластер не запустится без присутствия большинства из них.

kubeadm init phase certs etcd-ca

- сгенерит новый CA для нашего etcd-кластера. Так как все остальные сертификаты должны быть им подписанны, скопируем его вместе с приватным ключём на остальные мастер-ноды:

/etc/kubernetes/pki/etcd/ca.{key,crt}

Теперь перегенерим остальные etcd-сертификаты и static-манифесты для него на всех control-plane нодах:

kubeadm init phase certs etcd-healthcheck-clientkubeadm init phase certs etcd-peerkubeadm init phase certs etcd-serverkubeadm init phase etcd local

На этом этапе у нас уже должен подняться работоспособный etcd-кластер:

# crictl psCONTAINER ID        IMAGE               CREATED             STATE               NAME                ATTEMPT             POD IDac82b4ed5d83a       0369cf4303ffd       2 seconds ago       Running             etcd                0                   bc8b4d568751b

Теперь давайте проделаем тоже самое, но для для Kubernetes, на одной из master-нод выполним:

kubeadm init phase certs allkubeadm init phase kubeconfig allkubeadm init phase control-plane allcp -f /etc/kubernetes/admin.conf ~/.kube/config

Вышеописанные команды сгенирируют все SSL-сертификаты нашего Kubernetes-кластера.

Если вы используете kubeadm для джойна кубелетов, вам также потребуется обновить конфиг cluster-info в kube-public неймспейсе т.к. он до сих пор содержит хэш вашего старого CA.

kubeadm init phase bootstrap-token

Так как все сертификаты на других инстансах также должны быть подписаны одним CA, скопируем его на остальные control-plane ноды, и повторим вышеописанные команды на каждой из них.

/etc/kubernetes/pki/{ca,front-proxy-ca}.{key,crt}/etc/kubernetes/pki/sa.{key,pub}

Кстати, в качестве альтернативы ручного копирования сертификатов теперь вы можете использовать интерфейс Kubernetes, например следующая команда:

kubeadm init phase upload-certs --upload-certs

Зашифрует и загрузит сертификаты в Kubernetes на 2 часа, таким образом вы сможете сделать реджойн мастеров следующим образом:

kubeadm join phase control-plane-prepare all kubernetes-apiserver:6443 --control-plane --token cs0etm.ua7fbmwuf1jz946l     --discovery-token-ca-cert-hash sha256:555f6ececd4721fed0269d27a5c7f1c6d7ef4614157a18e56ed9a1fd031a3ab8 --certificate-key 385655ee0ab98d2441ba8038b4e8d03184df1806733eac131511891d1096be73kubeadm join phase control-plane-join all

Стоит заметить, что в API Kubernetes есть ещё один конфиг, который хранит CA сертификат для front-proxy client, он используется для аутентификации запросов от apiserver в вебхуках и прочих aggregation layer сервисах. К счастью kube-apiserver обновляет его автоматически.

Однако возможно вы захотите почистить его от старых сертификатов вручную:

kubectl get cm -n kube-system extension-apiserver-authentication -o yaml

В любом случае на данном этапе мы уже имеем полностью рабочий control-plane.

Чиним воркеров

Эта компанда выведет список всех нод кластера, хотя сейчас все они будут в статусе NotReady:

kubectl get node

Это потому что они по прежнему используют старые сертификаты и с ожидают запросов apiserver, подписанных старым CA. Для того чтобы это исправить мы воспользуемся kubeadm, и сделаем реджойн нод в кластер.

Когда как мастера имеют доступ к CA и могут быть присоеденены локально:

systemctl stop kubeletrm -rf /var/lib/kubelet/pki/ /etc/kubernetes/kubelet.confkubeadm init phase kubeconfig kubeletkubeadm init phase kubelet-start

То для джойна воркеров мы сгенерируем новый токен:

kubeadm token create --print-join-command

и на каждом из них выполним:

systemctl stop kubeletrm -rf /var/lib/kubelet/pki/ /etc/kubernetes/pki/ /etc/kubernetes/kubelet.conf kubeadm join phase kubelet-start kubernetes-apiserver:6443  --token cs0etm.ua7fbmwuf1jz946l     --discovery-token-ca-cert-hash sha256:555f6ececd4721fed0269d27a5c7f1c6d7ef4614157a18e56ed9a1fd031a3ab8

Внимание, удалять директорию /etc/kubernetes/pki/ на мастерах не нужно, так как она уже содержит все необходимые сертификаты.

Вышеописанная процедура переподключит все ваши kubelet'ы обратно к кластеру, при этом никак не повлияет на уже запущенные на них контейнеры. Однако если у вас в кластере много нод и вы сделаете это неодновременно, у вас может возникнуть ситуация когда controller-manager начнёт пересоздавать контейнеры с NotReady-нод и пытаться их запустить на живых нодах кластера.

Чтобы это предотвратить мы можем временно остановить controller-manager, на мастерах:

rm /etc/kubernetes/manifests/kube-controller-manager.yamlcrictl rmp `crictl ps --name kube-controller-manager -q`

Последняя команда нужна просто для того, чтобы удостовериться что под с controller-manager действительно не запущен. Как только все ноды кластера будут присоединены мы можем сгенерировать static-manifest для controller-manager обратно.

Для этого на всех мастерах выполняем:

kubeadm init phase control-plane controller-manager

Учтите что делать это нужно на этапе когда вы уже сгенерировали join token, в противном случае операция подключения зависнет на попытке прочитать токен из cluser-info.

В случае если kubelet настроен на получение сертификата подписанного вашим CA (опция serverTLSBootstrap: true), вам также потребуется заново подтвердить csr от ваших kubelet'ов:

kubectl get csrkubectl certificate approve <csr>

Чиним ServiceAccounts

Есть ещё один момент. Так как мы потеряли /etc/kubernetes/pki/sa.key - это тот самый ключ которм были подписаны jwt-токены для всех наших ServiceAccounts, то мы должны пересоздать токены для каждого из них.

Сделать это можно достаточно просто, удалив все секреты типа kubernetes.io/service-account-token:

kubectl get secret --all-namespaces | awk '/kubernetes.io\/service-account-token/ { print "kubectl delete secret -n " $1 " " $2}' | sh -s

После чего kube-controller-manager автоматически сгенерирует новые, подписанные новым ключём.

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

kubectl get pod --field-selector 'spec.serviceAccountName!=default' --no-headers --all-namespaces | awk '{print "kubectl delete pod -n " $1 " " $2}'

Например эта команда выведет список команд для удаления всех подов использующих недефолтный serviceAccount. Рекомендую начать с неймспейса kube-system, т.к. там могут быть установлен kube-proxy и CNI-плагин, жизненно необходимые для настройки коммуникации ваших микросервисов.

На этом восстановление кластера можно считать оконченным. Спасибо за внимание! В следующей статье мы подробнее рассмотрим бэкап и восстановление etcd-кластера.

Подробнее..

Как быстро и безболезненно сдать экзамен по Salesforce?

26.04.2021 20:23:29 | Автор: admin

Иван Левицкий, Salesforce разработчик, DataArt

Привет! Меня зовут Иван, как Salesforce разработчик я успел поработать уже в нескольких аутсорсинговых и аутстаффинговых компаниях, в локальных и распределенных командах, с клиентами из разных стран и индустрий. Соответственно, и потребности у заказчиков различались: одним инфраструктура Salesforce была нужна для внутренних систем, другим для работы с клиентами, третьим для разработки ISV-решений. С июля 2017 года моего первого знакомства с Salesforce я получил девять сертификатов, дважды экзамены мне приходилось пересдавать.

В этой статье я немного расскажу о самом Salesforce, но в основном речь в ней пойдет непосредственно о сертификатах и экзаменах: подготовке и сдаче.

О Salesforce

Logo historyLogo history

Немного о самом Salesforce, на случай если вы им предметно еще не интересовались. Это компания и одновременно ее ключевой продукт мировой лидер в области CRM. Но это не все, в Salesforce позиционируют себя как первый Cloud based CRM Solution и очень любят вспоминать термин No Software (даже используют в номере своего телефона 1-800-NO-SOFTWARE). А продукт с самого начала был задуман как SaaS Software as a Service облачная система, очень гибкая в плане настройки, масштабирования и расширения. Salesforce предлагает множество готовых решений для различных областей бизнеса: Sales Cloud, Service Cloud, Experience Cloud (Ex Community Cloud), CPQ, Force.com sites, Marketing B2B (Pardot), B2C clouds и это далеко не полный список.

Даже если вам не приходилось работать с инфраструктурой Salesforce, о новостях компании вы время от времени наверняка слышите: она в разное время поглотила таких IT-гигантов как Slack, Heroku и Tableau, не считая множества игроков поменьше, но также с серьезными именами. Кстати, Salesforce как компанию несколько раз признавали лучшим работодателем США, и на поддержку сообщества клиентов и Salesforce специалистов она тоже тратит значительные ресурсы. Короче говоря Salesforce экосистема в полном смысле слова.

Компании, купелнные Salesforce до 2020 годаКомпании, купелнные Salesforce до 2020 года

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

Для чего вообще нужна сертификация?

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

Насколько мне известно, сертификаты высоко ценятся среди:

Project Managerов Project Management Professional Certification (PMP);

Cyber Security специалистов: OSCP, OSCE, CISSP, SANS;

Salesforce специалистов.

Даже у бизнес-аналитиков мнения на этот счет уже значительно расходятся.

Что дает Salesforce сертификация?

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

Зачем это нужно Salesforce?

1. Сертификация обеспечивает ему дополнительный доход: допуск к экзамену стоит $ 200 или $ 400 (их очень много и предназначены они для людей разного профессионального уровня). Пересдача обойдется в $ 100 или $ 200, соответственно. Также есть возможность стать Salesforce CTA (Certified Technical Architect) всего за $ 6000 ($ 3000 за пересдачу). Тем не менее, речь здесь идет скорее о самоокупаемости самой системы сертификации, которая требует значительных ресурсов, в том числе человеческих.

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

Для чего это компании, в которой вы работаете?

Если вы работаете в продуктовой компании, ваш работодатель вряд ли заинтересован в том, чтобы вы получали сертификаты Salesforce. Если он, конечно, не занимается разработкой расширения функционала самой системы так называемых ISV.

Зато если ваша компания предоставляет услуги аутсорсинга или аутстаффинга, сертификация сотрудников становится для нее приоритетной.

Почему это так важно?

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

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

Для чего это лично вам?

1. Ваши сертификаты привязаны персонально к вам, а не к компании.

2. Даже если вы скептически относитесь к сертификации, вы все равно согласитесь с тем, что сертификаты характеризуют вас как человека, готового учиться. И все-таки гарантируют, что хотя бы кое-что по теме вы знаете.

3. Исходя из вышесказанного, сертификаты пригодятся вам при пересмотре компенсации или будущем трудоустройстве. Тем более, клиенты аутсорсинговых компаний могут требовать их наличия, а сертифицированные Salesforce разработчики всегда в дефиците.

Я уже молчу о возможности потешить свое эго, распечатав и повесив сертификаты на видном месте. Что вы, лично я так никогда не делал! Но в целом система ачивок, бейджей и титулов в Salesforce настроена здорово, и участвовать в настолько геймифицированном процессе приятно.

С чего начать?

Начинать однозначно стоит с регистрации бесплатной Dev org. Здесь вы будете экспериментировать с Salesforce.

Далее нужно ознакомиться со списком всех специальностей, работающих с Salesforce, и выбрать для себя наиболее подходящую. Так называемый Career Path вы можете посмотреть здесь.

Salesforce Certification Paths

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

Для большинства специальностей первым станет сертификат Salesforce Certified Administrator, хотя некоторые вначале сдают экзамен на право называться Salesforce Certified Platform App Builder. Последний включает в себя более обширный набор навыков, и подготовка занимает немного больше времени. Но в целом сертификаты Administrator и App Builder заметно пересекаются, поэтому лучше сдавать их почти одновременно, чтобы не повторять теорию лишний раз.

Очень часто наличие сертификата Salesforce Certified Administrator обязательное условие для допуска к другим экзаменам. Прежде всего тем, которые предназначены для консультантов. Для администраторов и Marketing Cloud Email специалистов Salesforce предусматривает пробные экзамены стоимостью $20. Их успешная сдача не гарантирует успешного прохождения реального испытания, зато помогает выявить собственные слабые стороны, а если таких не находится укрепляет уверенность в себе.

Как подготовиться к Salesforce экзамену?

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

Сделать это можно при регистрации на экзамен на сайте Webassesor.

2. Не менее важный момент настрой. Причем не на победу: вы должны быть морально готовы к неудаче, особенно если это ваш первый опыт Salesforce экзамена. Сдать его с первой попытки не удается очень многим, так что это не трагедия, а скорее норма. Это не экзамен в школе, институте или университете: в любом случае вас не уволят и даже ругать никто не станет.

Немного успокоительного пересдача обойдется дешевле. Еще $ 40 скидки сможете получить, посетив вебинары серии Certification Days. Больше информации здесь, только учтите, что скидки не суммируются.

3. Составьте план подготовки к экзамену. Занятиям рекомендует уделить не менее месяца, особенно, если речь о первом знакомстве с Salesforce.

4. Как только план готов, пора регистрироваться на экзамен. Без дедлайна ваши планы это просто планы. Даже если вы не успеете подготовиться к выбранному вами дню, за 72 часа до сдачи сможете перенести ее на более поздний срок бесплатно. Только не откладывайте решение на последний момент, иначе за изменение даты придется доплатить еще $ 75.

5. Действуйте.

Рекомендации по подготовке

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

Разделите весь процесс подготовки на пять этапов.

1-й этап (особенно важный, если у вас нет практического опыта) ознакомление с Trailhead, официальной платформой для изучения Salesforce. Начинать стоит с trailов, в названии которых есть словосочетания "Quick Start" или "Quick Look". В качестве самого первого рекомендую этот Trailhead: Quick Look (5 mins).

2-й этап знакомство с описанием экзамена. Его можно найти здесь: выберете роль и соответствующий экзамен.

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

4-й этап подготовка к экзамену по принципу 3-4-5. Не пытайтесь понять все и сразу, подходите к каждой теме итеративно. Представьте, что это обычный экзамен, только в роли экзаменатора на нем выступаете вы. Самостоятельно оценивайте свои знания по конкретным темам по шкале от 3 до 5. Будем оптимистами оценки 1 и 2 в расчет брать не будем.

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

5-й этап повторение. Обязательно пройдитесь по тому, что знаете хуже всего.

Бонусы:

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

Найдите базы вопросов по вашему сертификату. Двух-трех будет более чем достаточно, тем более, вопросы в них будут пересекаться. Никогда не покупайте платные дампы. В лучшем случае получите то, что и так нашлось бы в открытом доступе.

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

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

https://quizlet.com/ просто вбейте в строку поиска нужный вам экзамен;

https://t.me/SalesforceA группа в Telegram, где бесплатно выкладывают обновленные дампы Salesforce экзаменов;

https://focusonforce.com/ здесь есть все: теория, практика и объяснения каждого ответа. Сайт платный, но он того стоит.

На экзамене

В тесте будет 65 вопросов, пять из которых не влияют на результат они здесь для обкатки. Засчитывать или не засчитывать ответы на них, скорее всего, начнут уже при следующем Salesforce релизе. Зачем вам это знать? Если вы очень беспокоитесь о некоторых ответах постарайтесь убедить себя, что они относятся как раз к такой пятерке пробных вопросов. Наверное, в будущем их формулировки откорректируют.

Без паники. Salesforce клиентоориентированная компания, а вам повезло выступать в роли ее клиента. Что бы ни произошло, любая спорная ситуация, скорее всего, разрешится в вашу пользу. У меня есть опыт довольно стрессовых сдач Salesforce экзаменов (выключили электричество, экзаменационная программа зависла), но в каждом случае мне шли навстречу.

Распределите отведенное вам время. Не зацикливайтесь на сложном вопросе, у вас таких еще 64. Отложите его на потом.

Если не знаете ответа постарайтесь найти его методом исключения. Или положитесь на интуицию: это не мистика. а всего лишь не систематизированные знания.

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

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

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

Послесловие

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

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

Удачи на экзаменах!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru