Visual Studio용 Git SSH 설정

21716 단어 sshdevopsgit
때때로 우리는 새로운 개발 머신을 설정해야 합니다. 그리고 시간의 99%는 소스 제어 설정git을 의미합니다. 우리는 암호 인증이 불가능하다고 생각하므로 SSH 키 쌍을 사용하기 위해 새로운 Windows 10 설치를 부트스트랩하는 빠른 방법이 필요했습니다.

이게 방법이야



설정에는 OpenSSH가 설치되어 있고 ssh-agent가 실행 중이며 키 쌍이 생성되어 에이전트에 등록되어 있는지 확인하는 작업이 포함됩니다. 마지막으로 http://dev.azure.com/{orgname}/_usersSettings/keys로 이동하여 공개 키를 붙여넣습니다. 그러나 이것은 힘든 작업이며 대부분의 온라인 출처는 그렇게 하도록 제안하는 것 같습니다. 우리는 다음을 단순화하기로 결정했습니다.

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/tkhadimullin/win-ssh-bootstrap/master/install.ps1'))


그러면 다음이 다운로드되고 실행됩니다.

if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
    Write-Warning  "Running as non-Admin user. Skipping environment checks"
} else {
    $capability = Get-WindowsCapability -Online | Where-Object Name -like "OpenSSH.Client*"

    if($capability.State -ne "Installed") {
        Write-Information "Installing OpenSSH client"
        Add-WindowsCapability -Online -Name $capability.Name
    } else {
        Write-Information "OpenSSH client installed"
    }

    $sshAgent = Get-Service ssh-agent
    if($sshAgent.Status -eq "Stopped") {$sshAgent | Start-Service}
    if($sshAgent.StartType -eq "Disabled") {$sshAgent | Set-Service -StartupType Automatic }
}

if([String]::IsNullOrWhiteSpace([Environment]::GetEnvironmentVariable("GIT_SSH"))) {
    [Environment]::SetEnvironmentVariable("GIT_SSH", "$((Get-Command ssh).Source)", [System.EnvironmentVariableTarget]::User)
}

$keyPath = Join-Path $env:Userprofile ".ssh\id_rsa" {
 # Assuming file name here
if(-not (Test-Path $keyPath)) { 
    ssh-keygen -q -f $keyPath -C "autogenerated_key" -N """" # empty password
    ssh-add -q -f $keyPath
} 

$line = Get-Content -Path "$($keyPath).pub" | Select-Object -First 1 # assuming file name and key index

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form
$form.Text = 'Your SSH Key'
$form.Size = New-Object System.Drawing.Size(600,150)
$form.StartPosition = 'CenterScreen'

$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(260,70)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,10)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Copy your key and paste into ADO:'
$form.Controls.Add($label)

$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10,30)
$textBox.Size = New-Object System.Drawing.Size(560,40)
$textBox.Text = $line
$textBox.ReadOnly = $true

$form.Controls.Add($textBox)
$form.Add_Shown({$textBox.Select()})
$form.Topmost = $true
$form.ShowDialog()


이 스크립트는 전제 조건(관리자로 실행하는 경우)을 처리하거나 다른 모든 작업이 완료된 경우 키 생성을 시도합니다. 그런 다음 공개 키로 작은 창을 그립니다.

스크립트는 기존 키에 대해 몇 가지 가정을 하고 기본값으로 롤링됩니다. 전혀 멋진 것이 없습니다. 우리는 또한 ADO에 자동으로 게시하고 싶었지만 그렇게 하지 못했습니다(아래 참조).

비주얼 스튜디오 설정



다음 업무 순서는 IDE를 설정하는 것이었습니다. GIT_SSH 환경 변수를 설정하고 OpenSSH 배포에서 ssh.exe를 가리키지 않는 한 Visual Studio는 기본적으로 암호 자격 증명을 사용하는 것으로 보입니다. 스크립트도 이를 처리합니다.

Azure DevOps에 공개 키 게시(실제로 아님)



SSH 키 관리를 위한 ADOdoes not have an API. 따라서 PAT 및 서비스 자격 증명을 생성하는 것은 도움이 되지 않습니다. 우리는 프론트 엔드 호출을 리버스 엔지니어링하고 절차를 반복할 수 있을 만큼 충분히 격리되기를 바라면서 이를 가능하게 할 수 있습니다. 실제로 https://dev.azure.com/{org}/_apis/Contribution/HierarchyQuery에 페이로드를 보내는 문제입니다. 이것은 ADO Extensions이 업데이트를 게시하기 위한 일반적인 메시지 버스처럼 보입니다.

{
    "contributionIds": [
        "ms.vss-token-web.personal-access-token-issue-session-token-provider"
    ],
    "dataProviderContext": {
        "properties": {
            "displayName": "key-name",
            "publicData": "ssh-rsa Aaaaaaaaaaaaaabbbbbb key-comment",
            "validFrom": "2021-11-30T08:00:00.000Z",
            "validTo": "2026-11-30T08:00:00.000Z",
            "scope": "app_token",
            "targetAccounts": [
                "xxxxxxxx-xxxx-xxxxx-xxxx-xxxxxxxxxxxx"
            ],
            "isPublic": true
        }
    }
}


첫 번째 문제는 페이로드에서 바로 우리를 기다립니다. dataProviderContext.targetAccounts 값이 필요하지만 가져올 위치를 찾을 수 없습니다. 페이지의 다른 콘텐츠와 함께 로드되지만 열면 이 작업을 자동화할 목적이 없어집니다. 불행히도 우리가 부딪힌 유일한 장애물은 아닙니다.

입증



프런트 엔드는 이 요청을 인증하기 위해 쿠키를 사용합니다. 우리가 정말로 필요한 것은 UserAuthentication:

값은 app.vstoken.visualstudio.com에서 발행한 표준 JWT입니다. 그것을 얻으려면 앱을 등록하고 사용자가 oAuth 흐름을 거치도록 해야 합니다. 또한 ADO는 테넌트 및 조직의 개념으로 작동하기 때문에 대화형 로그인 없이 올바른 테넌시를 얻기가 까다롭습니다. 가능한 것처럼 보이지만 노력할 가치가 없다고 판단했습니다.

결론



완전 자동화된 열반에 도달할 수 없음에도 불구하고 SSH를 위해 시스템을 준비하고 복사-붙여넣기를 위해 공개 키를 노출해야 하는 상태에 이르렀습니다. ADO 프론트엔드를 리버스 엔지니어링하고 거기에서 토큰을 추출하는 것은 매우 달성 가능한 것처럼 보이지만 단계에서 우리는 그것을 추구하지 않습니다. 코드on GitHub를 게시하면 커뮤니티에서 코드를 밀어붙일 수 있다는 희미한 희망이 생깁니다.

좋은 웹페이지 즐겨찾기