2021. 12. 17. 23:11ㆍ항해99/실전프로젝트
백엔드 서버의 로그기록을 보고 싶다는 생각이 들었다.
그러나 현재 로그 기록은 EC2 인스턴스 내에 .log 파일로 존재하기에
EC2 인스턴스까지 들어가서 볼 수 밖에 없었다.
이 점을 해결하고자 자원까지 볼 수 있는 Spring Admin Server를 추가할려고한다.
Spring Admin 이란 Spring Boot Actuator에 GUI를 입힌거라 보면 편하며
Spring Boot Actuator는 실행 중인 애플리케이션에 대한 운영 정보( 상태, 메트릭, 정보, 덤프, 환경 등) 를 노출 하는 라이브러리이다.
또한 깃허브에 올라가는 DB 설정 코드들이 외부에 노출되기에 이를 해결하기 위해서
설정파일을 암호화 할 수 있는 jasypt 라이브러리를 추가하겠다.
01. Spring Admin Server 만들기
dependencies {
implementation 'de.codecentric:spring-boot-admin-starter-server'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
1. 새로운 Spring 프로젝트를 만들고 dependcies에 admin-starter-server를 추가한다.
#application.properties
server.port=8000
2. application.properties에 서버 포트를 8000번으로 지정해둔다.
@SpringBootApplication
@EnableAdminServer
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args);
}
}
3. Application Class에 @EnableAdminServer 애노테이션을 추가하여 AdminServer를 명시한다.
4. 마지막으로 admin server를 배포할 EC2 인스턴스의 인바운드 규칙에 8000번 포트를 열어준다.
https://github.com/salmon2/StarMonitoringServer
GitHub - salmon2/StarMonitoringServer
Contribute to salmon2/StarMonitoringServer development by creating an account on GitHub.
github.com
02. Spring Admin Client 설정하기
spring:
boot:
admin:
client:
auto-registration: 'true'
url: http://localhost:8000
spring.boot.admin.client.url : Spring Boot Admin 서버의 URL
spring.boot.admin.client.auto-registaration - true : 응용 프로그램이 준비된 후 자동으로 client를 등록한다.
management:
endpoints:
web:
exposure:
include: '*'
management.endpoints.web.exposure.include : 노출시킬 EndPoint 지정(*는 전체 노출)
application.yml을 설정하고 서버를 실행시키면 위처럼 Spring Boot Admin이 우리를 반겨주고 있다.
이처럼 현재 서버의 상태 또한 알 수 있다.
03. Spring Admin Logfile Viewer 추가
Spring Boot Admin로그 파일은 End Point 에서 자동으로 접근 할 수 없다. 그래서 Spring Boot에 있는 로그 파일을 Actuator endpoints에 설정을 해줘야된다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<!--로그 파일 저장 위치-->
<property name="LOG_FILE" value="/home/ec2-user/client.log"/>
<appender name="ROLLING-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>10</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
</appender>
<logger name="me.actuator" level="debug" additivity="false">
<!-- ref="appender name 지정" -->
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ROLLING-FILE"/>
</logger>
<root level="debug">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ROLLING-FILE"/>
</root>
</configuration>
그 전에 일단 log 파일을 생성하기 위해서 "/src/main/resource/logback-spring.xml"파일을 만들고 위 코드를
붙여넣기 한다.
logging:
pattern:
file: -%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx
file:
name: /home/ec2-user/client.log
management:
endpoint:
health:
show-details: always
logfile:
external-file: /home/ec2-user/client.log
logging.file : Spring Boot Admin에서 읽을 log파일 위치 설정
logging.pattern.file : 로그 패턴에 색깔을 넣는다.
management.endpoint.logfile.external-file :
endpoint로 설정할 log파일의 위치를 설정한다.
이렇게 yml파일을 수정하고 재배포 하게 된다면
이렇게 원격으로 로그파일을 읽을 수 있다.
04. applicaton.yml 설정 파일 암호화 하기
기존의 application.properteis 파일은 위처럼 database url을
그대로 노출된 채로 깃허브에 공유되어졌다.
뿐만 아니라 username과 password까지 공개되어 있어 제 3자 아무나 이 정보를 토대로
데이터베이스에 접속하고 데이터를 손상시킬 수 잇는 치명적인 약점을 가지게 된다.
이를 방지하고자 jsaypt 라이브러리를 추가하였다.
//Jsaypt properties 암호화
implementation "com.github.ulisesbocchio:jasypt-spring-boot-starter:1.17"
01. build.gradle에 jsaypt를 추가하여 해당하는 라이브러리를 프로젝트에 설치한다.
@Configuration
public class JasyptConfig {
public static String EncodeKey = "starProject";
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(EncodeKey); //암호화에 사용할 키 -> 중요
config.setAlgorithm("PBEWithMD5AndDES"); //사용할 알고리즘
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}
02.
@Configuration : 애노테이션을 이용하여 빈 설정파일을 만든다.
@Bean("jasyptStringEncryptor") : jasyptStringEncryptor이름으로 빈을 수동 등록한다.
앞으로 만약 StringEncryptor interface의 자동 주입은 이 함수에서 만든 객체가 자동주입된다.
setPassword, setAlgorithm : 암호화에 사용할 secreteKey와 암호화 알고리즘 사용
이 빈 설정 파일을 통해서 jasypt 암호화/복호화 설정을 완료할 수 있다.
jasypt:
encryptor:
bean: jasyptStringEncryptor
02-01. spring boot가 우리가 만든 커스텀한 Encryptor 알게 하기 위해서 yml 파일에 추가한다.
이때 값은 bean에 등록한 이름을 작성하면 된다. @bean 이름을 작성하지 않았다면 메소드 명을 작성하면 된다.
참고) https://www.baeldung.com/spring-boot-jasypt
public class AbstractServiceTest extends AbstractTest {
@Test
public void jasypt_encrypt_decrypt_test() {
String plainText = JasyptConfig.;
StandardPBEStringEncryptor jasypt = new StandardPBEStringEncryptor();
jasypt.setPassword("password");
jasypt.setAlgorithm("PBEWithMD5AndDES");
String encryptedText = jasypt.encrypt(sqlUrl 등등등);
String decryptedText = jasypt.decrypt(encryptedText);
assertThat(plainText).isEqualTo(decryptedText);
}
}
03. 이제 데이터를 암호화해야한다. 테스트 파일을 만들고 만들어진 encryptedText를 어디에 메모해둔다.
spring:
datasource:
username: ENC(HGBakYJL16edJF7A2LqqAA==)
url: ENC(FWVLS3Mx1oRcUPM6vwl9atMrt1CytQRML75UOAGEqocNo2jxFqEAncCBb900KV2leiMpxiD88sR2UZ4rdmqxMthC4BQoYsUJDK3iRIs1EGlN8saME8aOnJKyNcEdbcvq0VZe3PAzoxg=)
password: ENC(xNRWIp6LrRx8klhCxRKEpkgzss4Q3G3U)
04. 메모해 둔 encryptedText를 ENC()로 감싸서 yml 파일에 작성하면 암호화가 완료된다.
05. 참고
https://www.baeldung.com/spring-boot-jasypt
https://velog.io/@sixhustle/Jasypt
Jasypt
JASYPT(Java Simplified Encryption) Jasypt is a java library which allows the developer to add basic encryption capabilities to his/her projects with minimum effort, and without the need of having deep...
velog.io
https://toma0912.tistory.com/82
Jasypt를 이용한 properties 암호화
안녕하세요. 오늘은 Spring에서 지원해주는 Jasypt(Java Simplified Encryption)를 이용해서 데이터베이스 접속 정보나, 다양한 설정 정보들을 담아두고 있는 properties 또는, yaml 파일의 정보를 암호화하는
toma0912.tistory.com
백엔드 프로젝트 깃허브 : https://github.com/salmon2/StarProject
GitHub - salmon2/StarProject
Contribute to salmon2/StarProject development by creating an account on GitHub.
github.com
프로젝트 웹사이트 url : www.stellakorea.co.kr
별보러가지않을래?
캠핑 차박하실때 불멍만 즐기셨나요? 이제는 별도 구경해보세요! 별이 잘보이는 장소,날씨 정보보시고 나만의 캠핑,차박 장소도 공유 해보세요!
stellakorea.co.kr
'항해99 > 실전프로젝트' 카테고리의 다른 글
항해99 - 실전 프로젝트 09(Nginx + Let's Encrypt를 통한 https 구축) (0) | 2021.12.17 |
---|---|
항해99 - 실전 프로젝트 09(무중단 배포 2) (0) | 2021.12.17 |
항해99 - 실전 프로젝트 08(무중단 배포 1) (0) | 2021.12.17 |
항해99 - 실전 프로젝트 07(API 제작 - QueryDsl) (0) | 2021.12.17 |
항해99 - 실전 프로젝트 06(API 제작 - JPA) (0) | 2021.12.15 |