keysloth 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md ADDED
@@ -0,0 +1,448 @@
1
+ # KeySloth
2
+
3
+ Ruby gem для безопасного управления зашифрованными секретами в Git репозиториях.
4
+
5
+ ## Описание
6
+
7
+ KeySloth решает проблему безопасного хранения и распространения секретов (сертификаты, ключи, конфигурационные файлы) в команде разработки. Вместо хранения секретов напрямую в репозитории, KeySloth шифрует их с использованием AES-256-GCM и позволяет безопасно синхронизировать между участниками команды и CI/CD системами.
8
+
9
+ ### Основные возможности
10
+
11
+ - 🔐 **Надежное шифрование**: AES-256-GCM с защитой целостности данных
12
+ - 🚀 **Простота использования**: Одна команда для получения/отправки секретов
13
+ - 🔄 **Git интеграция**: Работает с любыми Git репозиториями через SSH
14
+ - 🛡️ **Безопасность**: Многоуровневая защита с SSH ключами и шифрованием
15
+ - 📦 **Backup'ы**: Автоматическое создание резервных копий
16
+ - 🎯 **CI/CD готовность**: Поддержка переменных окружения для автоматизации
17
+
18
+ ### Поддерживаемые типы файлов
19
+
20
+ - `.cer` - сертификаты
21
+ - `.p12` - PKCS#12 сертификаты
22
+ - `.mobileprovisioning` - профили подготовки iOS
23
+ - `.json` - конфигурационные файлы
24
+
25
+ ## Зависимости
26
+
27
+ Для работы KeySloth требуются системные инструменты:
28
+
29
+ - Git CLI (должен быть доступен в PATH)
30
+ - SSH-клиент (обычно OpenSSH), используемый через переменную `GIT_SSH_COMMAND`
31
+
32
+ ## Установка
33
+
34
+ ```bash
35
+ gem install keysloth
36
+ ```
37
+
38
+ Или добавьте в Gemfile:
39
+
40
+ ```ruby
41
+ gem 'keysloth'
42
+ ```
43
+
44
+ ## Быстрый старт
45
+
46
+ ### 1. Получение секретов
47
+
48
+ ```bash
49
+ keysloth pull -r git@github.com:company/secrets.git -p your_password
50
+ ```
51
+
52
+ ### 2. Отправка секретов
53
+
54
+ ```bash
55
+ keysloth push -r git@github.com:company/secrets.git -p your_password -m "Update certificates"
56
+ ```
57
+
58
+ ### 3. Проверка состояния
59
+
60
+ ```bash
61
+ keysloth status
62
+ ```
63
+
64
+ ## Использование
65
+
66
+ ### Команды
67
+
68
+ #### pull - Получение секретов
69
+
70
+ Получает зашифрованные секреты из Git репозитория и расшифровывает их локально:
71
+
72
+ ```bash
73
+ keysloth pull --repo git@github.com:company/secrets.git \
74
+ --password your_secret_password \
75
+ --branch main \
76
+ --path ./secrets
77
+ ```
78
+
79
+ **Параметры:**
80
+ - `--repo, -r` - URL Git репозитория (обязательно)
81
+ - `--password, -p` - Пароль для расшифровки (обязательно)
82
+ - `--branch, -b` - Ветка репозитория (по умолчанию: main)
83
+ - `--path, -d` - Локальный путь для секретов (по умолчанию: ./secrets)
84
+
85
+ #### push - Отправка секретов
86
+
87
+ Шифрует локальные секреты и отправляет их в Git репозиторий:
88
+
89
+ ```bash
90
+ keysloth push --repo git@github.com:company/secrets.git \
91
+ --password your_secret_password \
92
+ --message "Update mobile certificates" \
93
+ --branch main \
94
+ --path ./secrets
95
+ ```
96
+
97
+ **Параметры:**
98
+ - `--repo, -r` - URL Git репозитория (обязательно)
99
+ - `--password, -p` - Пароль для шифрования (обязательно)
100
+ - `--branch, -b` - Ветка репозитория (по умолчанию: main)
101
+ - `--path, -d` - Локальный путь с секретами (по умолчанию: ./secrets)
102
+ - `--message, -m` - Сообщение коммита (опционально)
103
+
104
+ #### status - Проверка состояния
105
+
106
+ Показывает информацию о локальных секретах и доступных backup'ах:
107
+
108
+ ```bash
109
+ keysloth status --path ./secrets
110
+ ```
111
+
112
+ #### restore - Восстановление из backup'а
113
+
114
+ Восстанавливает секреты из резервной копии:
115
+
116
+ ```bash
117
+ keysloth restore secrets_backup_20231215_143022 --path ./secrets
118
+ ```
119
+
120
+ ### Конфигурационный файл
121
+
122
+ KeySloth поддерживает файл конфигурации `.keyslothrc` в формате YAML:
123
+
124
+ ```yaml
125
+ # .keyslothrc
126
+ repo_url: "git@github.com:company/secrets.git"
127
+ branch: "main"
128
+ local_path: "./secrets"
129
+ backup_count: 3
130
+ ```
131
+
132
+ Параметры командной строки имеют приоритет над конфигурационным файлом.
133
+
134
+ ### Логирование
135
+
136
+ KeySloth поддерживает три уровня логирования:
137
+
138
+ ```bash
139
+ # Подробное логирование (DEBUG)
140
+ keysloth pull -r repo_url -p password --verbose
141
+
142
+ # Тихий режим (только ошибки)
143
+ keysloth pull -r repo_url -p password --quiet
144
+
145
+ # Обычное логирование (INFO) - по умолчанию
146
+ keysloth pull -r repo_url -p password
147
+ ```
148
+
149
+ ## Безопасность
150
+
151
+ ### Архитектура безопасности
152
+
153
+ KeySloth обеспечивает многоуровневую защиту:
154
+
155
+ 1. **SSH аутентификация** - доступ к репозиторию только через SSH ключи
156
+ 2. **AES-256-GCM шифрование** - надежное шифрование с защитой целостности
157
+ 3. **PBKDF2 деривация ключей** - безопасная генерация ключей из паролей
158
+ 4. **Зашифрованное хранение** - секреты хранятся зашифрованными в репозитории
159
+
160
+ ### Настройка SSH ключей
161
+
162
+ #### Локальная работа
163
+
164
+ Используйте стандартные SSH ключи:
165
+
166
+ ```bash
167
+ # Генерируем SSH ключ если нет
168
+ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
169
+
170
+ # Добавляем публичный ключ в GitHub/GitLab
171
+ cat ~/.ssh/id_rsa.pub
172
+ ```
173
+
174
+ #### CI/CD настройка
175
+
176
+ Для автоматизации используйте переменные окружения:
177
+
178
+ ```bash
179
+ # Экспортируем SSH ключ в переменную окружения
180
+ export SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)"
181
+ export SSH_PUBLIC_KEY="$(cat ~/.ssh/id_rsa.pub)"
182
+
183
+ # Используем в CI/CD
184
+ keysloth pull -r git@github.com:company/secrets.git -p $SECRET_PASSWORD
185
+ ```
186
+
187
+ #### Использование системного SSH (GIT_SSH_COMMAND)
188
+
189
+ При использовании ключей из переменных окружения в CI создаются временные файлы ключей и применяется `GIT_SSH_COMMAND`, например:
190
+
191
+ ```bash
192
+ export GIT_SSH_COMMAND='ssh -i /tmp/keysloth_ssh/id_rsa -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
193
+ ```
194
+
195
+ Для локальной разработки отключать проверку хостов не рекомендуется.
196
+
197
+ #### Требования к автору коммита
198
+
199
+ Перед отправкой изменений должны быть настроены глобальные параметры Git:
200
+
201
+ ```bash
202
+ git config --global user.name "Your Name"
203
+ git config --global user.email "you@example.com"
204
+ ```
205
+
206
+ #### Поведение git-операций
207
+
208
+ - Клонирование по умолчанию: `git clone --depth 1` (shallow).
209
+ - Если `git pull --ff-only` требует историю, выполняется `git fetch --unshallow`, затем повтор `pull`.
210
+ - Перед записью новых файлов очищаются все `.enc` в репозитории: `**/*.enc`.
211
+
212
+ ### Рекомендации по безопасности
213
+
214
+ 1. **Сильные пароли**: Используйте пароли длиной минимум 16 символов
215
+ 2. **Ротация ключей**: Регулярно обновляйте SSH ключи и пароли шифрования
216
+ 3. **Ограниченный доступ**: Предоставляйте доступ к репозиторию только необходимым участникам
217
+ 4. **Аудит**: Регулярно проверяйте логи доступа к репозиторию
218
+ 5. **Backup'ы**: Используйте автоматические backup'ы для восстановления
219
+
220
+ ## Интеграция с CI/CD
221
+
222
+ ### GitHub Actions
223
+
224
+ ```yaml
225
+ name: Deploy with Secrets
226
+ on: [push]
227
+
228
+ jobs:
229
+ deploy:
230
+ runs-on: ubuntu-latest
231
+ steps:
232
+ - uses: actions/checkout@v3
233
+
234
+ - name: Setup SSH key
235
+ env:
236
+ SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
237
+ run: |
238
+ mkdir -p ~/.ssh
239
+ echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
240
+ chmod 600 ~/.ssh/id_rsa
241
+ ssh-keyscan github.com >> ~/.ssh/known_hosts
242
+
243
+ - name: Install KeySloth
244
+ run: gem install keysloth
245
+
246
+ - name: Pull secrets
247
+ env:
248
+ SECRET_PASSWORD: ${{ secrets.SECRET_PASSWORD }}
249
+ run: |
250
+ keysloth pull -r git@github.com:company/secrets.git -p "$SECRET_PASSWORD"
251
+
252
+ - name: Deploy application
253
+ run: |
254
+ # Используем расшифрованные секреты для развертывания
255
+ ./deploy.sh
256
+ ```
257
+
258
+ ### GitLab CI
259
+
260
+ ```yaml
261
+ deploy:
262
+ stage: deploy
263
+ before_script:
264
+ - gem install keysloth
265
+ - mkdir -p ~/.ssh
266
+ - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
267
+ - chmod 600 ~/.ssh/id_rsa
268
+ - ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
269
+ script:
270
+ - keysloth pull -r git@gitlab.com:company/secrets.git -p "$SECRET_PASSWORD"
271
+ - ./deploy.sh
272
+ variables:
273
+ SSH_PRIVATE_KEY: $SSH_PRIVATE_KEY
274
+ SECRET_PASSWORD: $SECRET_PASSWORD
275
+ ```
276
+
277
+ ## Разработка
278
+
279
+ ### Установка для разработки
280
+
281
+ ```bash
282
+ git clone https://github.com/keysloth/keysloth.git
283
+ cd keysloth
284
+ bundle install
285
+ ```
286
+
287
+ ### Запуск тестов
288
+
289
+ ```bash
290
+ # Все тесты
291
+ bundle exec rake spec
292
+
293
+ # Тесты с покрытием кода
294
+ COVERAGE=true bundle exec rake spec
295
+
296
+ # Линтинг кода
297
+ bundle exec rake rubocop
298
+
299
+ # Все проверки
300
+ bundle exec rake check
301
+ ```
302
+
303
+ ### Структура проекта
304
+
305
+ ```
306
+ keysloth/
307
+ ├── lib/keysloth/ # Основная логика
308
+ │ ├── crypto.rb # Криптографические операции
309
+ │ ├── git_manager.rb # Работа с Git
310
+ │ ├── file_manager.rb # Файловые операции
311
+ │ ├── cli.rb # CLI интерфейс
312
+ │ ├── config.rb # Конфигурация
313
+ │ ├── logger.rb # Логирование
314
+ │ └── errors.rb # Обработка ошибок
315
+ ├── bin/keysloth # Исполняемый файл
316
+ ├── spec/ # Тесты RSpec
317
+ └── keysloth.gemspec # Спецификация gem'а
318
+ ```
319
+
320
+ ## Лицензия
321
+
322
+ MIT License. См. [LICENSE](LICENSE) для деталей.
323
+
324
+ ## Поддержка
325
+
326
+ - **Документация**: [GitHub Wiki](https://github.com/keysloth/keysloth/wiki)
327
+ - **Issues**: [GitHub Issues](https://github.com/keysloth/keysloth/issues)
328
+ - **Обсуждения**: [GitHub Discussions](https://github.com/keysloth/keysloth/discussions)
329
+
330
+ ## Troubleshooting
331
+
332
+ ### Часто встречающиеся проблемы
333
+
334
+ #### Ошибки аутентификации Git
335
+
336
+ **Проблема**: `Permission denied (publickey)` при выполнении pull/push
337
+
338
+ **Решение**:
339
+ ```bash
340
+ # Проверьте SSH ключи
341
+ ssh-add -l
342
+
343
+ # Добавьте SSH ключ если необходимо
344
+ ssh-add ~/.ssh/id_rsa
345
+
346
+ # Проверьте соединение с GitHub/GitLab
347
+ ssh -T git@github.com
348
+ ssh -T git@gitlab.com
349
+ ```
350
+
351
+ #### Ошибки расшифровки
352
+
353
+ **Проблема**: `Неверный пароль или поврежденные данные`
354
+
355
+ **Решение**:
356
+ 1. Проверьте правильность пароля
357
+ 2. Убедитесь что файлы не повреждены: `keysloth validate`
358
+ 3. Попробуйте восстановить из backup'а: `keysloth restore`
359
+
360
+ #### Ошибки файловой системы
361
+
362
+ **Проблема**: `Permission denied` при создании/чтении файлов
363
+
364
+ **Решение**:
365
+ ```bash
366
+ # Проверьте права доступа к директории
367
+ ls -la ./secrets
368
+
369
+ # Измените права если необходимо
370
+ chmod 755 ./secrets
371
+ chmod 644 ./secrets/*
372
+ ```
373
+
374
+ #### Проблемы с Git репозиторием
375
+
376
+ **Проблема**: `Repository not found` или `Could not read from remote repository`
377
+
378
+ **Решение**:
379
+ 1. Проверьте URL репозитория
380
+ 2. Убедитесь что у вас есть доступ к репозиторию
381
+ 3. Для приватных репозиториев проверьте SSH ключи
382
+
383
+ #### Ошибки в CI/CD
384
+
385
+ **Проблема**: Команды KeySloth не работают в CI/CD
386
+
387
+ **Решение**:
388
+ ```yaml
389
+ # Настройка SSH ключей в GitHub Actions
390
+ - name: Setup SSH key
391
+ env:
392
+ SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
393
+ run: |
394
+ mkdir -p ~/.ssh
395
+ echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
396
+ chmod 600 ~/.ssh/id_rsa
397
+ ssh-keyscan github.com >> ~/.ssh/known_hosts
398
+
399
+ # Установка gem'а
400
+ - name: Install KeySloth
401
+ run: gem install keysloth
402
+
403
+ # Использование с переменными окружения
404
+ - name: Pull secrets
405
+ env:
406
+ SECRET_PASSWORD: ${{ secrets.SECRET_PASSWORD }}
407
+ run: keysloth pull -r $REPO_URL -p "$SECRET_PASSWORD"
408
+ ```
409
+
410
+ #### Логирование для отладки
411
+
412
+ Используйте различные уровни логирования для диагностики:
413
+
414
+ ```bash
415
+ # Подробное логирование для отладки
416
+ keysloth pull -r repo_url -p password --verbose
417
+
418
+ # Тихий режим для CI/CD
419
+ keysloth pull -r repo_url -p password --quiet
420
+ ```
421
+
422
+ #### Backup и восстановление
423
+
424
+ При проблемах с секретами используйте backup'ы:
425
+
426
+ ```bash
427
+ # Посмотреть доступные backup'ы
428
+ keysloth status
429
+
430
+ # Восстановить из backup'а
431
+ keysloth restore secrets_backup_20231215_143022
432
+ ```
433
+
434
+ ### Получение помощи
435
+
436
+ Если проблема не решается:
437
+
438
+ 1. **Проверьте логи** с флагом `--verbose`
439
+ 2. **Создайте минимальный пример** для воспроизведения
440
+ 3. **Откройте issue** в [GitHub Issues](https://github.com/keysloth/keysloth/issues) с:
441
+ - Версией KeySloth (`keysloth version`)
442
+ - Версией Ruby (`ruby --version`)
443
+ - Полным текстом ошибки
444
+ - Шагами для воспроизведения
445
+
446
+ ## Changelog
447
+
448
+ См. [CHANGELOG.md](CHANGELOG.md) для истории изменений.
data/Rakefile ADDED
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+ require 'rubocop/rake_task'
6
+
7
+ # Настройка задач RSpec для тестирования
8
+ RSpec::Core::RakeTask.new(:spec) do |task|
9
+ task.rspec_opts = '--format documentation --color'
10
+ end
11
+
12
+ # Настройка задач RuboCop для линтинга
13
+ RuboCop::RakeTask.new(:rubocop) do |task|
14
+ task.options = ['--display-cop-names']
15
+ end
16
+
17
+ # Задача для автоматического исправления RuboCop
18
+ RuboCop::RakeTask.new('rubocop:autocorrect') do |task|
19
+ task.options = ['--autocorrect']
20
+ end
21
+
22
+ # Задача для установки зависимостей
23
+ desc 'Установить зависимости'
24
+ task :install do
25
+ sh 'bundle install'
26
+ end
27
+
28
+ # Задача для сборки gem'а
29
+ desc 'Собрать gem'
30
+ task :build do
31
+ sh 'gem build keysloth.gemspec'
32
+ end
33
+
34
+ # Задача для очистки временных файлов
35
+ desc 'Очистить временные файлы'
36
+ task :clean do
37
+ FileUtils.rm_rf('tmp/')
38
+ FileUtils.rm_rf('coverage/')
39
+ FileUtils.rm_f(Dir.glob('*.gem'))
40
+ end
41
+
42
+ # Задача для полной проверки кода
43
+ desc 'Запустить все проверки (тесты + линтинг)'
44
+ task check: %i[rubocop spec]
45
+
46
+ # Задача для подготовки к релизу
47
+ desc 'Подготовить к релизу (проверки + сборка)'
48
+ task release_prepare: %i[clean check build]
49
+
50
+ # Задача для генерации документации
51
+ desc 'Генерировать YARD документацию'
52
+ task :docs do
53
+ sh 'yard doc'
54
+ end
55
+
56
+ # Задача по умолчанию
57
+ task default: :check
58
+
59
+ # Задачи для разработки
60
+ namespace :dev do
61
+ desc 'Установить git hooks для разработки'
62
+ task :setup_hooks do
63
+ hook_content = <<~HOOK
64
+ #!/bin/sh
65
+ echo "Запускаем проверки перед коммитом..."
66
+ bundle exec rake rubocop || exit 1
67
+ bundle exec rake spec || exit 1
68
+ echo "Все проверки пройдены успешно!"
69
+ HOOK
70
+
71
+ hook_path = '.git/hooks/pre-commit'
72
+ File.write(hook_path, hook_content)
73
+ File.chmod(0o755, hook_path)
74
+ puts 'Git pre-commit hook установлен'
75
+ end
76
+
77
+ desc 'Запустить интерактивную консоль'
78
+ task :console do
79
+ require_relative 'lib/keysloth'
80
+ require 'pry'
81
+ Pry.start
82
+ end
83
+ end
84
+
85
+ # Задачи для CI/CD
86
+ namespace :ci do
87
+ desc 'Запустить тесты с покрытием кода'
88
+ task :test_coverage do
89
+ ENV['COVERAGE'] = 'true'
90
+ Rake::Task[:spec].invoke
91
+ end
92
+
93
+ desc 'Проверить безопасность зависимостей'
94
+ task :security do
95
+ sh 'bundle audit check --update'
96
+ rescue StandardError => e
97
+ puts "Предупреждение: проверка безопасности не прошла: #{e.message}"
98
+ end
99
+ end
data/bin/keysloth ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../lib/keysloth'
5
+ require_relative '../lib/keysloth/cli'
6
+
7
+ begin
8
+ KeySloth::CLI.start(ARGV)
9
+ rescue KeySloth::KeySlothError => e
10
+ warn "Ошибка KeySloth: #{e.message}"
11
+ exit 1
12
+ rescue StandardError => e
13
+ warn "Неожиданная ошибка: #{e.message}"
14
+ warn "Backtrace: #{e.backtrace.join("\n")}" if ENV['DEBUG']
15
+ exit 1
16
+ end
data/keysloth.gemspec ADDED
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/keysloth/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'keysloth'
7
+ spec.version = KeySloth::VERSION
8
+ spec.authors = ['KeySloth Team']
9
+ spec.email = ['team@keysloth.org']
10
+
11
+ spec.summary = 'Ruby gem для управления зашифрованными секретами в Git репозиториях'
12
+ spec.description = <<~DESC
13
+ KeySloth - инструмент для безопасного хранения и управления секретами (сертификаты,#{' '}
14
+ ключи, конфигурационные файлы) в зашифрованном виде в Git репозиториях.#{' '}
15
+ Обеспечивает простое получение, изменение и отправку секретов с использованием#{' '}
16
+ AES-256-GCM шифрования.
17
+ DESC
18
+ spec.homepage = 'https://github.com/keysloth/keysloth'
19
+ spec.license = 'MIT'
20
+ spec.required_ruby_version = '>= 2.7.0'
21
+
22
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
23
+ spec.metadata['homepage_uri'] = spec.homepage
24
+ spec.metadata['source_code_uri'] = 'https://github.com/keysloth/keysloth'
25
+ spec.metadata['changelog_uri'] = 'https://github.com/keysloth/keysloth/blob/main/CHANGELOG.md'
26
+ spec.metadata['rubygems_mfa_required'] = 'true'
27
+
28
+ # Определяем, какие файлы включить в gem
29
+ spec.files = Dir.chdir(__dir__) do
30
+ `git ls-files -z`.split("\x0").reject do |f|
31
+ f.start_with?('spec/', 'test/', 'features/', '.git', 'appveyor', 'Gemfile')
32
+ end
33
+ end
34
+
35
+ spec.bindir = 'bin'
36
+ spec.executables = ['keysloth']
37
+ spec.require_paths = ['lib']
38
+
39
+ # Основные зависимости
40
+ spec.add_dependency 'thor', '~> 1.2' # CLI интерфейс
41
+ # Используем системные git команды вместо rugged для упрощения установки
42
+ # Используем встроенный openssl, доступный в Ruby по умолчанию
43
+
44
+ # Зависимости для разработки
45
+ spec.add_development_dependency 'rspec', '~> 3.12'
46
+ spec.add_development_dependency 'rubocop', '~> 1.50'
47
+ spec.add_development_dependency 'rubocop-performance', '~> 1.17'
48
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.20'
49
+ spec.add_development_dependency 'simplecov', '~> 0.22'
50
+ spec.add_development_dependency 'yard', '~> 0.9'
51
+ end