SSH key 접속 방식은
서버에 접속 할 때 비밀번호 대신 key를 제출하는 방식이다.
(나같은 경우 회사의 서버에 war 파일을 배포할때 build.gradle에 작성하여 ssh로 파일을 이동시키고 있다.)
SSH key는 공개키(public key)와 비공개 키(private key)로 이루어진다.
키를 생성하면 공개키와 비공개키가 만들어진다.
이 중에 비공개키는 로컬 머신(나의 경우 회사 서버)에 위치해야 하고, 공개키는 리모트 머신(나의 경우 업무용 노트북)에 위치해야 한다. (로컬 머신은 SSH Client, 리모트 머신은 SSH Server가 설치된 컴퓨터를 의미한다.)
SSH 접속을 시도하면 SSH Client가 로컬 머신의 비공개키와 원격 머신의 공개키를 비교해서 둘이 일치하는지를 확인한다.
🦊 SSH key 생성
서버에 키를 생성해 보자.
ssh-keygen이라는 프로그램을 사용한다.
서버에 접속한 상태에서 홈 디렉토리(~/)에서 $ssh-keygen을 입력한다.
기본값으로 RSA 암호화 방식 2048 바이트의 공개키/비공개키 쌍이 생성된다.
입력하게 되면 첫번째로 SSH key를 저장할 위치를 지정해야 한다. 아무것도 입력하지 않으면 기본값(~/.ssh)에 저장한다.
SSH client는 기본적으로 이 디렉토리에 있는 key를 이용하여 인증을 시도한다.
두번째로 passphrase를 입력한다.
passphrase는 비공개키를 생성할 때, 이를 다시금 암호화시키는 값이다.
하지만 여기서는 gradle을 이용하여 war파일을 자동으로 배포하는 것이 목적이므로,
자동 로그인이 필요한 지금은 입력하지 않고 공란으로 둔다.
세 번째는 같은 passphrase를 입력하면 된다.
(빈칸이었으니 그대로 엔터를 친다)
ssh key를 생성한 직후의 화면은 다음과 같다:
키가 생성되었는지 확인해보자.
$ ls -al ~/.ssh 또는 $ ll ~/.ssh
비공개 키와 공개 키가 같이 생성되어있는 모습이다.
🦊 authorized_keys 작성
클라이언트에서 비공개 키로 접속을 시도하면 서버는 authorized_keys에 있는 공개 키와 비교한다.
방금 발급받은 공개 키인 id_rsa.pub를 ssh-copy-id 커맨드를 사용하여 .ssh/authorized_keys 에 복사하자.
$ ssh-copy-id [username]@[servername]
server_name은 ip 주소 혹은 도메인 주소를 넣을 수 있다.
공개키와 autorized_keys 에 복사한 공개키를 확인해보자
$ cat ~/.ssh/id_rsa.pub
$ cat ~/.ssh/authorized_keys
공개 키와 authorized_keys 두 파일이 동일한 것을 볼 수 있다.
🦊 gradle 프로젝트에서 ssh key 를 통해 서버에 배포하기
intellij IDE 에서 build.gradle 에 작성하여 서버에 배포할 수 있다.
dependencies에 ssh plugin 추가
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.2.RELEASE")
classpath("org.hidetake:gradle-ssh-plugin:2.2.0")
}
}
apply plugin: 'org.hidetake.ssh'
remotes {
webServer1 {//dev server
host = 'xxx.xxx.x.xx'
port = 22
user = 'userName'
identity = file('id_rsa')
knownHosts = allowAnyHosts
}
}
task('deployDevAction_d2')
dependsOn 'bootWar'
group = 'application'
doLast {
String path = bootWar.destinationDirectory.getAsFile().get()
String filename = bootWar.archiveFileName.get()
println 'path : '+path
println 'filename : '+filename
ssh.run {
session(remotes.webServer1) {
put from: "${path}/${filename}", into: './'
execute ("sudo chown tomcat ${filename}")
execute ("sudo mv ${filename} /opt/dev/tomcat_d2/webapps/devsvr2.war")
}
}
}
}
작성 후 적용하게 되면 Task에 application 이 생기고, 이 Task를 통해 원격 서버에 war파일을 넣어줄 수 있다.
빌드를 jar 로 할 경우, scp 명령어를 통해 서버에 전송하여 돌려도 되고,
war로 빌드해서 서버의 tomcat의 webapps에 넣어줘도 된다.
나는 회사에 입사했을때 회사에 WAS(tomcat)환경이 있어 war배포 방법을 배웠었지만, 김영한님의 강의나 Spring boot에서는 가이드 하는 표준은 jar이다.
'기타' 카테고리의 다른 글
Github access Token 발행하기 (0) | 2022.03.18 |
---|---|
[JavaSrcipt] 티스토리 콘솔창 꾸미기 (0) | 2021.11.19 |
intellij 한글 입력이 안될때 (2) | 2021.11.12 |
오류 : java.io.IOExcetion: 파이프가 닫히는 중입니다. (0) | 2021.11.12 |
[Gradle 에러] Could not find method compile() (0) | 2021.05.31 |
댓글