항해99 - 실전프로젝트 10(모니터링, 설정파일 암호화)

2021. 12. 17. 23:11항해99/실전프로젝트

728x90

백엔드 서버의 로그기록을 보고 싶다는 생각이 들었다.

그러나 현재 로그 기록은 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