В последние пару месяцев я много использовал S3, и с Amazon SDK для Ruby работать с ним действительно просто (как и со всеми другими сервисами AWS, которые SDK поддерживает в настоящее время). На самом деле настолько простой, что вы можете довольно легко удалить все свои объекты без особого труда. Я сделал несколько тестов и обнаружил, что (с пакетными операциями) понадобилось около 3 минут, чтобы удалить ~ 75000 файлов с терабайтом. Однопоточный.
Распараллелите эту рабочую нагрузку, и вы сможете за считанные минуты выбросить все в свои корзины S3 практически для любого количества объектов. Само собой разумеется, что если хакер получит ваши учетные данные, необычайное количество урона может быть нанесено очень легко и за очень короткое время. Принимая во внимание, что часто регистрируется доступ к нескольким часам, вы, вероятно, не узнаете о таких доступах до тех пор, пока это не произойдет. Другая потенциальная причина удаления — это, конечно, человеческая ошибка (и это, как правило, более вероятно) В обоих случаях есть что-то, что вы можете с этим поделать.
Контейнеры S3 поддерживают версионирование уже более двух лет , и если вы используете SVN, Git или какую-либо другую систему контроля версий, вы уже поймете, как она работает. Методы доступа к простым объектам и их версиям немного различаются, но основные идеи одинаковы (методы доступа к объектам обычно работают только с последней, не удаленной версией). С помощью управления версиями вы уже можете защитить себя от случайного удаления, поскольку вы можете вернуться к последней не удаленной версии в любое время.
Однако ничто не мешает вам удалить все версии файла, а вместе с ним и все следы того, что этот файл когда-либо существовал. Это явное отклонение от аналогии с исходными системами управления версиями, поскольку любой объект с версиями, которые еще присутствуют, будет по-прежнему стоить вам реальных денег (даже если последняя версия является маркером удаления). Таким образом, вы можете добавить многофакторную аутентификацию к своему доступу API к S3 и защитить эти операции удаления версий.
Это существовало в веб-API в течение некоторого времени, но недавно я включил коммит в официальный SDK, который позволяет вам включить удаление MFA из корзины, и есть еще один в полете, который позволит вам фактически использовать многофакторный токены в отдельных запросах на удаление. Использование немного интересное, поэтому я подумал, что продемонстрирую, как это делается в Ruby, и немного расскажу о его возможных вариантах использования. Если вы хотите использовать его сейчас, вам придется развернуть мою ветку (до тех пор, пока запрос на объединение не будет объединен).
Включение МФА
Я не буду вдаваться в подробности о приобретении фактического устройства MFA, поскольку оно достаточно подробно описано в официальной документации, но достаточно сказать, что вы можете купить настоящий аппаратный токен TOTP или использовать «виртуальные» приложения MFA от Amazon или Google для iPhone или Android. Настроить их и связать их с учетной записью также довольно просто (если вы используете консоль AWS; инструменты IAM командной строки — это совсем другое дело).
Настройка удаления MFA на вашем ведре на самом деле довольно тривиальна:
require 'rubygems' require 'aws-sdk' s3 = AWS::S3.new(:access_key_id => 'XXXX', :secret_access_key => 'XXXX') bucket = s3.buckets['my-test-bucket'] bucket.enable_versioning(:mfa_delete => 'Enable', :mfa => 'arn:aws:iam::123456789012:mfa/root-account-mfa-device 123456')
За кулисами это мало чем отличается от включения управления версиями без MFA. Он добавляет новый элемент в запрос XML, который запрашивает включение удаления MFA, и добавляет заголовок, содержащий серийный номер устройства MFA и текущий номер токена. Важно (и это может сбить вас с толку, если вы начали использовать средства управления доступом IAM), только владелец группы может включать / отключать удаление MFA. В случае «стандартной» учетной записи и делегированных учетных записей IAM под ней это будет «стандартная» учетная запись (даже если для создания корзины использовалась одна из дополнительных учетных записей).
Удаление версии с MFA
Теперь все еще можно удалять объекты, но не версии. Удаление версии выглядит примерно так же, но требует передачи серийного номера / токена, если включено удаление MFA:
require 'rubygems' require 'aws-sdk' s3 = AWS::S3.new(:access_key_id => 'XXXX', :secret_access_key => 'XXXX') bucket = s3.buckets['my-test-bucket'] bucket.versions['itHPX6m8na_sog0cAtkgP3QITEE8v5ij'].delete(:mfa => 'arn:aws:iam::123456789012:mfa/root-account-mfa-device 123456')
Как упоминалось выше, есть некоторые ограничения для этого (как вы, наверное, догадались):
- Будучи системой TOTP, токены можно использовать только один раз. Это означает, что вы можете удалить одну версию с одним токеном, не более. Учитывая, что на физических устройствах TOTP Google Authenticator и Gemalto токен генерируется раз в 30 секунд, полное удаление всех следов объекта, который был ранее удален (оригинальная версия + маркер удаления), может занять до минуты.
- Исходя из этого, почти невозможно рассмотреть возможность выполнения большого количества удалений. Внутри AWS :: S3 :: ObjectCollection есть метод пакетного удаления объектов, но он не интегрирован ни с одним из механизмов удаления MFA. Даже в этом случае вы можете выполнять одновременно только 1000 удалений.
Я не уверен, насколько это практично. MFA включает в себя процесс, ориентированный на человека, поскольку он включает в себя что-то, что у вас есть, а не то, чем вы являетесь, или то, что вы знаете (оба из них достаточно легко переносятся один раз в компьютер). Учитывая, что носитель доступа — это API, разработанный для быстрого и легкого использования, похоже, существует несоответствие импеданса. Тем не менее, с некоторой реализацией, обеспечивающей работу пакетных удалений, она, вероятно, все еще будет использоваться во многих случаях.
Используете ли вы удаление MFA (через какой-либо из встроенных API или других языковых SDK или даже сторонних приложений)? Я хотел бы услышать об опыте других людей с ним — оставьте свои комментарии ниже.