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.
- checksums.yaml +7 -0
- data/.keyslothrc.example +14 -0
- data/.rspec +4 -0
- data/.rubocop.yml +98 -0
- data/.yardopts +8 -0
- data/CHANGELOG.md +45 -0
- data/Makefile +193 -0
- data/README.md +448 -0
- data/Rakefile +99 -0
- data/bin/keysloth +16 -0
- data/keysloth.gemspec +51 -0
- data/lib/keysloth/cli.rb +468 -0
- data/lib/keysloth/config.rb +129 -0
- data/lib/keysloth/crypto.rb +304 -0
- data/lib/keysloth/errors.rb +41 -0
- data/lib/keysloth/file_manager.rb +450 -0
- data/lib/keysloth/git_manager.rb +394 -0
- data/lib/keysloth/logger.rb +172 -0
- data/lib/keysloth/version.rb +6 -0
- data/lib/keysloth.rb +275 -0
- data/task/cr.md +59 -0
- data/task/plan.md +169 -0
- data/task/ragged_removing.md +103 -0
- data/task/task.md +43 -0
- data/task/test_plan.md +266 -0
- metadata +174 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 49887eb92bcda0765f1598cff713b8820be1bf341259d22797c0b7cbce8a0ed6
|
|
4
|
+
data.tar.gz: eaa959d6e6bd4495635dd09c53f5c6e66911f517b10639651e691d7d67cfefd4
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 4be3619d2eb8e824132985421b8ea5b7853921dae1e42962543ee313bb6e59bdb8e9091b454781e441a112fe7e35f4aba769e0293ae55bb084de0c4c1cb5f107
|
|
7
|
+
data.tar.gz: 933bf6a35dce1daebd282f90627fad87f13660089b6972044ba68b939d05572b50bf0fa39b357a8bd01417f31e64dae58c339c801dc987b7dd0312fec622ccea
|
data/.keyslothrc.example
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Пример конфигурационного файла KeySloth
|
|
2
|
+
# Скопируйте этот файл в .keyslothrc и настройте под ваш проект
|
|
3
|
+
|
|
4
|
+
# URL Git репозитория для хранения зашифрованных секретов (SSH)
|
|
5
|
+
repo_url: "git@github.com:company/secrets.git"
|
|
6
|
+
|
|
7
|
+
# Ветка по умолчанию для работы с секретами
|
|
8
|
+
branch: "main"
|
|
9
|
+
|
|
10
|
+
# Локальный путь для расшифрованных секретов
|
|
11
|
+
local_path: "./secrets"
|
|
12
|
+
|
|
13
|
+
# Количество резервных копий для хранения
|
|
14
|
+
backup_count: 3
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
require:
|
|
2
|
+
- rubocop-performance
|
|
3
|
+
- rubocop-rspec
|
|
4
|
+
|
|
5
|
+
AllCops:
|
|
6
|
+
TargetRubyVersion: 2.7
|
|
7
|
+
NewCops: enable
|
|
8
|
+
Exclude:
|
|
9
|
+
- 'vendor/**/*'
|
|
10
|
+
- 'tmp/**/*'
|
|
11
|
+
- 'spec/fixtures/**/*'
|
|
12
|
+
|
|
13
|
+
# Настройки стиля
|
|
14
|
+
|
|
15
|
+
Layout/LineLength:
|
|
16
|
+
Max: 100
|
|
17
|
+
Exclude:
|
|
18
|
+
- 'keysloth.gemspec'
|
|
19
|
+
|
|
20
|
+
Layout/MultilineMethodCallIndentation:
|
|
21
|
+
EnforcedStyle: indented
|
|
22
|
+
|
|
23
|
+
Metrics/ClassLength:
|
|
24
|
+
Max: 150
|
|
25
|
+
|
|
26
|
+
Metrics/MethodLength:
|
|
27
|
+
Max: 25
|
|
28
|
+
Exclude:
|
|
29
|
+
- 'spec/**/*'
|
|
30
|
+
|
|
31
|
+
Metrics/ModuleLength:
|
|
32
|
+
Max: 150
|
|
33
|
+
|
|
34
|
+
Metrics/BlockLength:
|
|
35
|
+
Exclude:
|
|
36
|
+
- 'spec/**/*'
|
|
37
|
+
- 'Rakefile'
|
|
38
|
+
- 'keysloth.gemspec'
|
|
39
|
+
|
|
40
|
+
Metrics/AbcSize:
|
|
41
|
+
Max: 20
|
|
42
|
+
Exclude:
|
|
43
|
+
- 'spec/**/*'
|
|
44
|
+
|
|
45
|
+
# Настройки документации
|
|
46
|
+
|
|
47
|
+
Style/Documentation:
|
|
48
|
+
Enabled: true
|
|
49
|
+
Exclude:
|
|
50
|
+
- 'spec/**/*'
|
|
51
|
+
|
|
52
|
+
Style/DocumentationMethod:
|
|
53
|
+
Enabled: true
|
|
54
|
+
RequireForNonPublicMethods: false
|
|
55
|
+
|
|
56
|
+
# Настройки безопасности
|
|
57
|
+
|
|
58
|
+
Security/Eval:
|
|
59
|
+
Enabled: true
|
|
60
|
+
|
|
61
|
+
Security/YAMLLoad:
|
|
62
|
+
Enabled: true
|
|
63
|
+
|
|
64
|
+
# Настройки производительности
|
|
65
|
+
|
|
66
|
+
Performance/StringReplacement:
|
|
67
|
+
Enabled: true
|
|
68
|
+
|
|
69
|
+
Performance/RedundantBlockCall:
|
|
70
|
+
Enabled: true
|
|
71
|
+
|
|
72
|
+
# Настройки для RSpec
|
|
73
|
+
|
|
74
|
+
RSpec/ExampleLength:
|
|
75
|
+
Max: 15
|
|
76
|
+
|
|
77
|
+
RSpec/MultipleExpectations:
|
|
78
|
+
Max: 5
|
|
79
|
+
|
|
80
|
+
RSpec/NestedGroups:
|
|
81
|
+
Max: 4
|
|
82
|
+
|
|
83
|
+
RSpec/DescribeClass:
|
|
84
|
+
Enabled: true
|
|
85
|
+
|
|
86
|
+
# Отключаем некоторые правила для большей гибкости
|
|
87
|
+
|
|
88
|
+
Style/FrozenStringLiteralComment:
|
|
89
|
+
Enabled: true
|
|
90
|
+
|
|
91
|
+
Style/StringLiterals:
|
|
92
|
+
EnforcedStyle: single_quotes
|
|
93
|
+
|
|
94
|
+
Style/ClassAndModuleChildren:
|
|
95
|
+
Enabled: false
|
|
96
|
+
|
|
97
|
+
Style/GuardClause:
|
|
98
|
+
Enabled: false
|
data/.yardopts
ADDED
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Все значимые изменения в проекте KeySloth будут документированы в этом файле.
|
|
4
|
+
|
|
5
|
+
Формат основан на [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
и этот проект придерживается [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.1] - 2025-09-02
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- Переведена работа с Git на системный git (через Open3), удалена зависимость от Rugged/libgit2
|
|
14
|
+
- Обновлены тесты `spec/keysloth/git_manager_spec.rb` под системный git
|
|
15
|
+
- Улучшена SSH-аутентификация: поддержка `KEYSLOTH_SSH_KEY_PATH`, `SSH_PRIVATE_KEY`/`SSH_PUBLIC_KEY` через `GIT_SSH_COMMAND`
|
|
16
|
+
- Поведение pull: `git fetch` + `git pull --ff-only`, с fallback на `--unshallow`
|
|
17
|
+
- Очистка `.enc` и запись файлов выполняются через файловую систему
|
|
18
|
+
- Добавлена проверка настроек автора коммита (`user.name`/`user.email`)
|
|
19
|
+
|
|
20
|
+
### Docs
|
|
21
|
+
- Удалены инструкции про Rugged из `task/test_plan.md`; уточнены требования к Git/SSH
|
|
22
|
+
|
|
23
|
+
## [0.1.0] - 2023-12-15
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
- Первоначальный релиз KeySloth
|
|
27
|
+
- Базовая функциональность шифрования/дешифрования с использованием AES-256-GCM
|
|
28
|
+
- Поддержка работы с Git репозиториями через SSH
|
|
29
|
+
- CLI интерфейс с командами pull, push, status, restore
|
|
30
|
+
- Поддержка файлов секретов: .cer, .p12, .mobileprovisioning, .json
|
|
31
|
+
- Автоматическое создание резервных копий
|
|
32
|
+
- Многоуровневое логирование (DEBUG, INFO, ERROR)
|
|
33
|
+
- Поддержка конфигурационных файлов .keyslothrc
|
|
34
|
+
- Интеграция с CI/CD системами через переменные окружения
|
|
35
|
+
- Валидация входных данных и обработка ошибок
|
|
36
|
+
- Полная документация API и пользовательская документация
|
|
37
|
+
- Тесты RSpec с покрытием кода
|
|
38
|
+
- Линтинг кода с RuboCop
|
|
39
|
+
- Поддержка Ruby 2.7+
|
|
40
|
+
|
|
41
|
+
### Security
|
|
42
|
+
- Реализована защита целостности данных с помощью GCM режима
|
|
43
|
+
- Безопасная деривация ключей из паролей с использованием PBKDF2
|
|
44
|
+
- Поддержка только SSH аутентификации для Git операций
|
|
45
|
+
- Валидация путей файлов для предотвращения атак directory traversal
|
data/Makefile
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Makefile для KeySloth - управление зашифрованными секретами
|
|
2
|
+
#
|
|
3
|
+
# Этот файл содержит примеры команд для работы с KeySloth в проекте.
|
|
4
|
+
# Настройте переменные ниже под ваш проект.
|
|
5
|
+
|
|
6
|
+
# =============================================================================
|
|
7
|
+
# КОНФИГУРАЦИЯ
|
|
8
|
+
# =============================================================================
|
|
9
|
+
|
|
10
|
+
# URL вашего репозитория с секретами (измените на свой)
|
|
11
|
+
SECRETS_REPO := git@github.com:company/secrets.git
|
|
12
|
+
|
|
13
|
+
# Ветка с секретами
|
|
14
|
+
SECRETS_BRANCH := main
|
|
15
|
+
|
|
16
|
+
# Локальная директория для секретов (добавьте в .gitignore!)
|
|
17
|
+
SECRETS_DIR := ./secrets
|
|
18
|
+
|
|
19
|
+
# Пароль для шифрования (установите в переменной окружения)
|
|
20
|
+
# Проверка будет выполняться только для команд, которые требуют пароль
|
|
21
|
+
|
|
22
|
+
# =============================================================================
|
|
23
|
+
# ОСНОВНЫЕ КОМАНДЫ
|
|
24
|
+
# =============================================================================
|
|
25
|
+
|
|
26
|
+
.PHONY: help
|
|
27
|
+
help: ## Показать справку по доступным командам
|
|
28
|
+
@echo "KeySloth Makefile - Управление зашифрованными секретами"
|
|
29
|
+
@echo ""
|
|
30
|
+
@echo "НАСТРОЙКА:"
|
|
31
|
+
@echo " 1. Установите SECRET_PASSWORD: export SECRET_PASSWORD=your_password"
|
|
32
|
+
@echo " 2. Измените SECRETS_REPO на URL вашего репозитория"
|
|
33
|
+
@echo " 3. Убедитесь что $(SECRETS_DIR) добавлен в .gitignore"
|
|
34
|
+
@echo ""
|
|
35
|
+
@echo "КОМАНДЫ:"
|
|
36
|
+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
|
37
|
+
|
|
38
|
+
.PHONY: install
|
|
39
|
+
install: ## Установить KeySloth gem
|
|
40
|
+
gem install keysloth
|
|
41
|
+
|
|
42
|
+
.PHONY: init
|
|
43
|
+
init: ## Инициализировать KeySloth в проекте
|
|
44
|
+
keysloth init -r $(SECRETS_REPO) -b $(SECRETS_BRANCH) -d $(SECRETS_DIR)
|
|
45
|
+
|
|
46
|
+
.PHONY: pull
|
|
47
|
+
pull: check-password ## Получить и расшифровать секреты из репозитория
|
|
48
|
+
@echo "🔽 Получаем секреты из $(SECRETS_REPO)..."
|
|
49
|
+
keysloth pull -r $(SECRETS_REPO) -b $(SECRETS_BRANCH) -p "$(SECRET_PASSWORD)" -d $(SECRETS_DIR)
|
|
50
|
+
@echo "✅ Секреты успешно получены в $(SECRETS_DIR)"
|
|
51
|
+
|
|
52
|
+
.PHONY: push
|
|
53
|
+
push: check-password ## Зашифровать и отправить секреты в репозиторий
|
|
54
|
+
@echo "🔼 Отправляем секреты в $(SECRETS_REPO)..."
|
|
55
|
+
@read -p "Введите сообщение коммита: " msg; \
|
|
56
|
+
keysloth push -r $(SECRETS_REPO) -b $(SECRETS_BRANCH) -p "$(SECRET_PASSWORD)" -d $(SECRETS_DIR) -m "$$msg"
|
|
57
|
+
@echo "✅ Секреты успешно отправлены"
|
|
58
|
+
|
|
59
|
+
.PHONY: status
|
|
60
|
+
status: ## Проверить состояние локальных секретов
|
|
61
|
+
@echo "📊 Проверяем состояние секретов..."
|
|
62
|
+
keysloth status -d $(SECRETS_DIR)
|
|
63
|
+
|
|
64
|
+
.PHONY: validate
|
|
65
|
+
validate: ## Проверить целостность файлов секретов
|
|
66
|
+
@echo "🔍 Проверяем целостность секретов..."
|
|
67
|
+
keysloth validate -d $(SECRETS_DIR)
|
|
68
|
+
|
|
69
|
+
.PHONY: backup-list
|
|
70
|
+
backup-list: ## Показать доступные резервные копии
|
|
71
|
+
@echo "📁 Доступные резервные копии:"
|
|
72
|
+
@ls -la $(SECRETS_DIR)_backup_* 2>/dev/null || echo "Резервные копии не найдены"
|
|
73
|
+
|
|
74
|
+
.PHONY: restore
|
|
75
|
+
restore: ## Восстановить секреты из backup'а (использование: make restore BACKUP=backup_name)
|
|
76
|
+
@if [ -z "$(BACKUP)" ]; then \
|
|
77
|
+
echo "❌ Укажите backup для восстановления: make restore BACKUP=secrets_backup_20231215_143022"; \
|
|
78
|
+
exit 1; \
|
|
79
|
+
fi
|
|
80
|
+
@echo "🔄 Восстанавливаем из $(BACKUP)..."
|
|
81
|
+
keysloth restore $(BACKUP) -d $(SECRETS_DIR)
|
|
82
|
+
@echo "✅ Восстановление завершено"
|
|
83
|
+
|
|
84
|
+
# =============================================================================
|
|
85
|
+
# РАЗРАБОТКА И ОТЛАДКА
|
|
86
|
+
# =============================================================================
|
|
87
|
+
|
|
88
|
+
.PHONY: check-password
|
|
89
|
+
check-password: ## Проверить что установлен SECRET_PASSWORD
|
|
90
|
+
@if [ -z "$(SECRET_PASSWORD)" ]; then \
|
|
91
|
+
echo "❌ SECRET_PASSWORD не установлен. Выполните: export SECRET_PASSWORD=your_password"; \
|
|
92
|
+
exit 1; \
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
.PHONY: pull-verbose
|
|
96
|
+
pull-verbose: check-password ## Получить секреты с подробным логированием
|
|
97
|
+
keysloth pull -r $(SECRETS_REPO) -b $(SECRETS_BRANCH) -p "$(SECRET_PASSWORD)" -d $(SECRETS_DIR) --verbose
|
|
98
|
+
|
|
99
|
+
.PHONY: push-verbose
|
|
100
|
+
push-verbose: check-password ## Отправить секреты с подробным логированием
|
|
101
|
+
@read -p "Введите сообщение коммита: " msg; \
|
|
102
|
+
keysloth push -r $(SECRETS_REPO) -b $(SECRETS_BRANCH) -p "$(SECRET_PASSWORD)" -d $(SECRETS_DIR) -m "$$msg" --verbose
|
|
103
|
+
|
|
104
|
+
.PHONY: version
|
|
105
|
+
version: ## Показать версию KeySloth
|
|
106
|
+
keysloth version
|
|
107
|
+
|
|
108
|
+
# =============================================================================
|
|
109
|
+
# CI/CD КОМАНДЫ
|
|
110
|
+
# =============================================================================
|
|
111
|
+
|
|
112
|
+
.PHONY: ci-setup-ssh
|
|
113
|
+
ci-setup-ssh: ## Настроить SSH ключи в CI/CD (требует SSH_PRIVATE_KEY)
|
|
114
|
+
@if [ -z "$(SSH_PRIVATE_KEY)" ]; then \
|
|
115
|
+
echo "❌ SSH_PRIVATE_KEY не установлен"; \
|
|
116
|
+
exit 1; \
|
|
117
|
+
fi
|
|
118
|
+
@echo "🔑 Настраиваем SSH ключи для CI/CD..."
|
|
119
|
+
@mkdir -p ~/.ssh
|
|
120
|
+
@echo "$(SSH_PRIVATE_KEY)" > ~/.ssh/id_rsa
|
|
121
|
+
@chmod 600 ~/.ssh/id_rsa
|
|
122
|
+
@ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null || true
|
|
123
|
+
@ssh-keyscan gitlab.com >> ~/.ssh/known_hosts 2>/dev/null || true
|
|
124
|
+
@echo "✅ SSH ключи настроены"
|
|
125
|
+
|
|
126
|
+
.PHONY: ci-pull
|
|
127
|
+
ci-pull: ci-setup-ssh check-password ## Получить секреты в CI/CD среде
|
|
128
|
+
@echo "🤖 CI/CD: Получаем секреты..."
|
|
129
|
+
keysloth pull -r $(SECRETS_REPO) -b $(SECRETS_BRANCH) -p "$(SECRET_PASSWORD)" -d $(SECRETS_DIR) --quiet
|
|
130
|
+
|
|
131
|
+
.PHONY: ci-validate
|
|
132
|
+
ci-validate: ## Проверить секреты в CI/CD среде
|
|
133
|
+
@echo "🤖 CI/CD: Проверяем секреты..."
|
|
134
|
+
keysloth validate -d $(SECRETS_DIR) --quiet
|
|
135
|
+
|
|
136
|
+
# =============================================================================
|
|
137
|
+
# ОЧИСТКА
|
|
138
|
+
# =============================================================================
|
|
139
|
+
|
|
140
|
+
.PHONY: clean
|
|
141
|
+
clean: ## Удалить локальные секреты и backup'ы
|
|
142
|
+
@echo "🧹 Очищаем локальные секреты..."
|
|
143
|
+
@rm -rf $(SECRETS_DIR)
|
|
144
|
+
@rm -rf $(SECRETS_DIR)_backup_*
|
|
145
|
+
@echo "✅ Локальные секреты удалены"
|
|
146
|
+
|
|
147
|
+
.PHONY: clean-docs
|
|
148
|
+
clean-docs: ## Удалить сгенерированную документацию
|
|
149
|
+
@echo "🧹 Очищаем документацию..."
|
|
150
|
+
@rm -rf doc/
|
|
151
|
+
@echo "✅ Документация удалена"
|
|
152
|
+
|
|
153
|
+
# =============================================================================
|
|
154
|
+
# ПРИМЕРЫ КОМАНД
|
|
155
|
+
# =============================================================================
|
|
156
|
+
|
|
157
|
+
.PHONY: example-setup
|
|
158
|
+
example-setup: ## Пример полной настройки проекта
|
|
159
|
+
@echo "📖 Пример настройки KeySloth в проекте:"
|
|
160
|
+
@echo ""
|
|
161
|
+
@echo "1. Установите переменные окружения:"
|
|
162
|
+
@echo " export SECRET_PASSWORD=your_strong_password"
|
|
163
|
+
@echo ""
|
|
164
|
+
@echo "2. Инициализируйте проект:"
|
|
165
|
+
@echo " make init"
|
|
166
|
+
@echo ""
|
|
167
|
+
@echo "3. Добавьте файлы секретов в $(SECRETS_DIR)/"
|
|
168
|
+
@echo ""
|
|
169
|
+
@echo "4. Отправьте секреты в репозиторий:"
|
|
170
|
+
@echo " make push"
|
|
171
|
+
@echo ""
|
|
172
|
+
@echo "5. Другие участники команды могут получить секреты:"
|
|
173
|
+
@echo " make pull"
|
|
174
|
+
|
|
175
|
+
.PHONY: example-ci
|
|
176
|
+
example-ci: ## Пример использования в CI/CD
|
|
177
|
+
@echo "📖 Пример настройки в CI/CD:"
|
|
178
|
+
@echo ""
|
|
179
|
+
@echo "GitHub Actions (.github/workflows/deploy.yml):"
|
|
180
|
+
@echo " env:"
|
|
181
|
+
@echo " SECRET_PASSWORD: \$${{ secrets.SECRET_PASSWORD }}"
|
|
182
|
+
@echo " SSH_PRIVATE_KEY: \$${{ secrets.SSH_PRIVATE_KEY }}"
|
|
183
|
+
@echo " run: |"
|
|
184
|
+
@echo " make ci-pull"
|
|
185
|
+
@echo " make ci-validate"
|
|
186
|
+
@echo ""
|
|
187
|
+
@echo "GitLab CI (.gitlab-ci.yml):"
|
|
188
|
+
@echo " variables:"
|
|
189
|
+
@echo " SECRET_PASSWORD: \$$SECRET_PASSWORD"
|
|
190
|
+
@echo " SSH_PRIVATE_KEY: \$$SSH_PRIVATE_KEY"
|
|
191
|
+
@echo " script:"
|
|
192
|
+
@echo " - make ci-pull"
|
|
193
|
+
@echo " - make ci-validate"
|