쿠...sal

[컴][웹][자바][스프링] Spring Boot 에서 executable war 사용



Spring Boot 에서 executable war 사용

사용이유

ref. 1 에 따르면 jsp 를 사용하려면 executable jar 로 묶어서는 안되고, .war 로 packaging 을 해야 한다고 한다.

source code

여기서는 gs-spring-boot source 를 사용할 것이다. git clone 을 통해 가져오면 된다. 그런 후에 complete folder 에 있는 소스를 사용하면 된다.
  • git clone https://github.com/spring-guides/gs-spring-boot.git

build.gradle

그래서 build.gradle 에서 bootJar 을 지우고, bootWar 을 적은후 gradlew build 를 하면 된다. 또는 enabled 속성을 이용하면 된다.


만약 2개를 build.gradle 에 적어놓는다면, gradlew bootWar 를 이용하면 된다. 그러면 아래 경로에 만들어진다.
  • <root>\build\libs\broker-sb-0.1.0-SNAPSHOT.war
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'war'

bootWar {
    // https://docs.gradle.org/current/userguide/war_plugin.html
    enabled = true
    baseName = 'broker-sb'
    version = '0.1.0-SNAPSHOT'
}

bootJar {
    // this determines the jar name.
    enabled = false
    baseName = 'broker-sb'    // ./build/libs/broker-sb-0.1.0.jar
    version =  '0.1.0'
}

webapp directory

아래와 같은 구조로 다음 경로에 webapp 을 만들면 된다.
  • <root>\src\main\webapp\
webapp
   + resources
   + WEB-INF
      + config
      + property
      + tags
      + views

lib에 있는 jar이 .so 등을 필요로 한다면


결과적으로 lib에 같이 넣을 수 없을 듯 하다. 실제로 executable jar / executable war 모두에서 lib 를 읽어드릴때 netsted jar 로 가정하고 읽어드렸다. 그래서 모두 아래와 같은 exception이 발생했다.

c:\a\programming\java\mm\springboot-test\complete\build\libs>java -jar mmbroker-sb-0.1.0-SNAPSHOT.war
Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry WEB-INF/lib/libsigar-amd64-linux.so
        at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:108)
        at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:86)
        at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:70)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:49)
        at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:58)
Caused by: java.io.IOException: Unable to open nested jar file 'WEB-INF/lib/libsigar-amd64-linux.so'
        at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:254)
        at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:239)
        at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:103)
        ... 4 more
Caused by: java.io.IOException: Unable to find ZIP central directory records after reading 65792 bytes
        at org.springframework.boot.loader.jar.CentralDirectoryEndRecord.<init>(CentralDirectoryEndRecord.java:65)
        at org.springframework.boot.loader.jar.CentralDirectoryParser.parse(CentralDirectoryParser.java:52)
        at org.springframework.boot.loader.jar.JarFile.<init>(JarFile.java:121)
        at org.springframework.boot.loader.jar.JarFile.<init>(JarFile.java:109)
        at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:287)
        at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:262)
        at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:250)
        ... 6 more

References

  1. Spring Boot Reference Guide > 27.4.5 JSP Limitations

[컴][리눅스] systemd 사용법

sys 사용법 / init 사용법 /


systemd 사용법

commands

  • systemctl : 현재 동작중인 서비스들을 보여준다.
    • systemctl list-unit-files : 등록된 모든 service 들을 보여준다.
    • systemctl list-dependencies mariadb.service : mariadb.service 의 서비스간의 의존관계(dependecy)를 보여준다.
    • systemctl set-default <new_taget_file> : 기본 target 을 변경
    • systemctl get-default : 기본 target 을 알려준다.
    • systemctl isolate runlevel5.target : runlevel5 로 runlevel 을 변경한다.
    • service 실행
      • systemctl start foo.service
      • systemctl stop foo.service
      • systemctl restart foo.service
      • systemctl status foo.service
    • 부팅시 실행
      • systemctl enable foo.service : 부팅시 실행
      • systemctl disable foo.service : 부팅시 실행하지 않도록
  • systemd-analyze : 부팅에 소요된 시간을 알 수 있다.
    • systemd-analyze blame : 각 서비스별 초기화에 걸린 시간을 확인할 수 있다.
    • systemd-analyze plot : init 시간을 그래프로 나타내 준다. output 을 html 로 저장해서 보면 된다.
    • systemd-analyze critical-chain <service_name> : 초기화에 시간을 많이 먹는 서비스들을 보여준다.
  • systemd-cgls
  • systemd-cgtop
  • systemd-loginctl


unit file

기본적으로 /usr/lib/system 디렉토리에 Unit File 을 보관한다. 보통 .service 의 확장자(?)를 가지고 있다.

만약 기존의 unit file 을 변경하려면, 이 파일을 직접 변경하는 것보단 override 하는 것을 추천한다.[ref.1]

systemctl edit

systemctl edit mariadb
수정할 수 있다. 자세한 내용은 ref. 1, ref. 4 을 확인하자.

unit file 만들기



target

타겟(Target)은 Sys V 에 Run Level 과 비슷하다. 즉, booting 을 어느 단계까지 할 것이냐를 결정하는 것이라고 보면 된다.

target 도 아래 경로에서 확인할 수 있다.(.target 으로 되어 있다.)

  • /usr/lib/systemd/system/

default target 변경

기본적으로 runlevel*.target(symbolic link 이다.) 이 존재한다. 그래서 이것을 sysv 의 runlevel 처럼 사용하면 된다.


# systemctl set-default runlevel3.target
# systemctl get-default

isolate target

현재 target 을 바꾸고 싶으면 isolate 을 사용하면 된다. (isolate 의 의미)
# systemctl isolate runlevel5.target
예를 들어 만약 gui 를 사용하고 있는데 isolate runlevel3.target 을 하면, gui 를 닫아버리고, runlevel3.target 에 맞추게 된다.

현재 active target 확인

# systemctl list-units --type=target


References

  1. CentOS 7 Systemd 이해하기 - Voyager of Linux
  2. 서버 프로세스를 관리하는 올바른 방법 - CODEOK.NET
  3. Useful SystemD commands (hints for systemctl or systemctl vs chkconfig and service)
  4. 10.6. Creating and Modifying systemd Unit Files - Red Hat Customer Portal

[컴] 코딩 관련 youtube

dev tube / devtube / dev youtube / coding youtube / 코딩 유투브 /


코딩 관련 youtube 를 모아놓은 사이트, 데브튜브


[컴][네트워크] DMZ

dmz / network 네트워크에서 DMZ

DMZ

간단히 이야기하면, 외부망과 내부망 사이에 만약 서버를 둔다고 하면, 이 서버가 DMZ 에 있다고 한다.


DMZ 조건


  • LAN과는 다른 subnet 에 있어야 한다.

DMZ 를 통해 얻을 수 있는 이익


  • 외부로 노출되는 부분을 최소화로 열고, 나머지들을 firewall 로 막을 수 있다.(DMZ --> LAN)
  • 공격자가 실질적은 공격을 위해 LAN의 정확한 주소를 얻는데에 대해 시간을 벌 수 있다.


DMZ 에 대한 설명





[컴][리눅스] Linux에서 Login 실패 시 로그인 제한하기



일정 횟수 이상 실패시 제한 / 계정 잠그기


Linux에서 Login 실패 시 로그인 제한하기

리눅스에서 계정에 관한 대부분의 설정은 /etc/login.defs에서 가능

pam_tally2 로 로그인 실패시 계정 제한

PAM (Pluggable Authentication Modules)

# vi /etc/pam.d/password-auth

아래 파일을 보면 대충 어떻게 설정하는지 알 수 있다. 3번 로그인 실패하면 20분(1200초)동안 잠그게 된다.
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.

auth        required      pam_tally2.so  file=/var/log/tallylog deny=3 even_deny_root unlock_time=1200
...
account     required      pam_unix.so
account     required      pam_tally2.so

~
~
~
~


pam_tally2

user id 의 failure count 를 확인할 수 있다.
# pam_tally2 --user=my_user_id

잠겨버린 계정을 해제
# pam_tally2 --user=my_user_id --reset



pam_faillock 을 사용해서 계정 잠그기

pam_fillock 은 pam_tolly2 의 login 실패기능에 대한 기능향상 버전이다. (참고) 그래서 이녀석을 쓰면 훨씬 다양한 정보를 얻을 수 있다.

설정

아래 내용을 2개의 파일 모두에 넣으면 된다. 순서가 중요하다.

# vi /etc/pam.d/password-auth
# vi /etc/pam.d/system-auth

auth        required      pam_faillock.so preauth silent audit deny=3 unlock_time=600
auth        sufficient    pam_unix.so nullok try_first_pass
auth        [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600

...

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so
account     required      pam_faillock.so


root 계정도 잠그기

만약 root 도 일정 실패 이후에 잠그고 싶다면 even_deny_root 를 추가하면 된다.
pam_faillock.so preauth silent audit deny=3 even_deny_root unlock_time=600

sshd restart

그리고 sshd 를 restart 해줘야 한다.
systemctl restart sshd

실패한 로그인 시도 확인

faillock --user my_user_id


'faillock' 를 치면, 실패한 로그인 전체 목록을 볼 수 있다.

실패로그 삭제

user 의 인증실패로그(authentication failure log)를 삭제하려면 아래처럼 하면 된다.
faillock --user aaronkilik --reset



References

  1. How to Lock User Accounts After Failed Login Attempts
  2. Use Pam_Tally2 to Lock and Unlock SSH Failed Login Attempts
  3. Linux ETC - Login 실패시 계정 잠그기 및 PAM 설정