Безопасно ли вставлять закрытый ключ в веб-портал Jenkins? - PullRequest
7 голосов
/ 18 марта 2020

В Дженкинсе, я только что видел один способ хранения закрытых учетных данных ключа sh.

Этот метод рекомендуется всем: откройте веб-портал сервера Jenkins в веб-браузере, от go до Credentials и в разделе Add Credentials выберите SSH Username with private key, вставьте закрытый ключ в Интернет. и нажмите ok.

Предполагается, что при этом используется форма HTML для отправки закрытого ключа в запросе POST через HTTPS на сервер Jenkins, который затем сохраняет закрытый ключ локально на диске сервера.

Проблема . Ответ на вопрос « Как безопасно отправлять закрытые ключи? » гласит, что закрытый ключ s sh может быть защищен только вообще не передает .

Мой вопрос : действительно ли защищенный секретный ключ вставляется в веб-портал Jenkins и передается по HTTPS? Если нет, то как лучше всего ввести закрытый ключ в учетные данные Jenkins?

Ответы [ 3 ]

3 голосов
/ 12 апреля 2020

in situ

Использование веб-интерфейса для этого, вероятно, безопасно достаточно почти для каждого случая использования, и его трудно превзойти по удобству.

Тем не менее, генерация закрытых ключей там, где они нужны, - это, безусловно, хороший совет, и он определенно возможен в Jenkins. Один из подходов:

  • S SH на сервере Jenkins и генерация ключей
  • Запустите в консоли сценариев groovy, чтобы создать учетные данные Jenkins
  • Exfiltrate publi c key
  • Удаление сгенерированных ключей на сервере

В этом примере на сервере Jenkins и $HOME, и $JENKINS_HOME указывают на /var/jenkins_home и ключи генерируются в ~/temp.


Генерация ключа на сервере Jenkins

ssh jenkins@my.jenkins.server
mkdir ~/temp
cd ~/temp
ssh-keygen -t rsa -b 4096 -C "some-meaningful-label" -f "./my-in-situ-key"

Это создает my-in-situ-key и my-in-situ-key.pub in /var/jenkins_home/temp.


Создание учетных данных Jenkins

В консоли сценариев Jenkins:

import com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey
import com.cloudbees.plugins.credentials.CredentialsScope
import com.cloudbees.plugins.credentials.domains.Domain

def domain = Domain.global()

def store = Jenkins.instance.getExtensionList('com.cloudbees.plugins.credentials.SystemCredentialsProvider')[0].getStore()

def privateKeyString = new File('/var/jenkins_home/temp/my-in-situ-key').text
def keySource = new BasicSSHUserPrivateKey.DirectEntryPrivateKeySource(privateKeyString)

def privateKeyCredential = new BasicSSHUserPrivateKey(
    CredentialsScope.GLOBAL,
    "temp-stack-overflow-key",      // id
    "jenkins",                      // username
    keySource,                      // private key
    "",                             // passphrase
    "Temporary Demo Key"            // description
)

store.addCredentials(domain, privateKeyCredential)
"Credential Added"

Проверка учетных данных перед очисткой up.


Очистка

Возьмите ключ publi c и обязательно удалите закрытый ключ на выходе. дверь.

cat ~/temp/my-in-situ-key.pub
rm -rf ~/temp

Соответствует Javado c

1 голос
/ 09 апреля 2020

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

При этом копирование / вставка ключа в Jenkins Web GUI с зашифрованной передачей между вашим клиентом и сервером Jenkins считается достаточно безопасной, особенно в корпоративной локальной сети (Local Area Network). ) к вашему собственному серверу Jenkins.

Если вы говорите по глобальной сети через inte rnet, тогда ... это не полностью пуленепробиваемый сейф. Но для некоторых заданий в Jenkins (если только эти задания не раскрывают конфиденциальные данные) этого должно быть достаточно.

0 голосов
/ 12 апреля 2020

Краткий ответ - «Нет». Если вам нужен идентификатор S SH на сервере Jenkins, создайте для него отдельный открытый / закрытый ключ и используйте его исключительно для этой цели.

...