반응형

상황에 따라서 오류라고 볼 수도있고 아닐수도있다.

 

centos7 에서 root권한을 부여한 새 계정을 발급해달라는 요청이 왔다.

 

일반사용자로 로그인 한 후 su 명령어로 root권한이 부여한 계정을 사용하도록 2개의 계정을 생성하기로 하였다.

(해당 작업은 root계정으로)

useradd nuser
passwd nuser

nuser = 일반사용자

useradd ruser
passwd ruser

ruser = root권한사용자

 

ruser 계정을 생성한 후에 vi /etc/passwd으로 열어서

 

ruser:x:0:0::/home/ruser:/bin/bash

 

이렇게 0으로 변경해주고

 

 

vi /etc/group을 열어서

 

root:x:0:ruser

 

으로 변경해줬다.

 

그리고 나서  새 세션으로 일반사용자(nuser)로 로그인 후 

 

su ruser

 

명령어로 root권한 사용자로 su 명령어를 날리면

 

su : 권한 부여 거부

 

요렇게 떳다..

 

이 이유는 nuser가 root권한 계정으로 전환하는 권한이 부여되있지 않기 때문이다.

 

다시한번 .... 

 

vi /etc/group을 열고 아래와같이 wheel에 root권한 부여된 계정으로 전환할 일반 사용자 계정을 아래와같이 추가 후 저장

 

wheel:x:10:root,nuser

 

다시 접속해서 su명령어시 오류 없이 전환된다

반응형
반응형

 

이번엔 http code가 노출된다는 취약점 결과가 날라왔다. 

 

이전에 http code노출 막는 포스팅을 한 적이 있는데, 이와 다른 경우가 발생하였다.

2022.12.08 - [개발/취약점] - http 400 505 error code 노출 막기

 

http 400 505 error code 노출 막기

400 505번 http error code 출력되는 취약점 발생했다. 톰캣/conf/web.xml에 400 /error.html 401 /error.html 403 /error.html 404 /error.html 405 /error.html 500 /error.html 501 /error.html 정의를 하고 server.xml파일의 docBase에 error.htm

lsdev.tistory.com

1. web.xml에 error code별 html을 설정해줘도 안되서

 

2. server.xml설정을 해준 바 있다.(톰캣 8.5.82를 사용하고 있음)

 

분명히 http code와 tomcat 정보가 노출되지 않도록 설정을 했고 웹사이트에서 확인을 하였다.

 

(취약점을 내가 적용하기 전에 진단했나? 하며 확인해봤더니 날짜가 그렇지 않음을 확인... 주절주절)

 

curl --location --request GE@T 'https://url정보입력:포트'

터미널에서 이렇게 날려보니(GE@T :일부러 잘못된 요청을 해봄. 내가 위에 첨부한 이미지처럼 400이 발생하도록)

 

어? 그런데

취약점 보고서에 나온 내용대로 동일하게 위와 같이 오류가 나온다!

 

톰캣 access로그를 확인해보니 해당 요청(curl --location --request GE@T 'https://url정보입력:포트')에 대해선

 

로그가 안찍힌다. 들어오지 못하는걸까?

 

WAS로 가기전에 우리는 웹서버를 사용하지 않고 먼저, Haproxy에서 WAS로 로드밸런싱을 해준다.

 

Haproxy 설정에 대해서 찾아보니 HAProxy 구성 파일(haproxy.cfg)에 별도의 오류 페이지 설정이 없는 경우,

 

기본적으로 HAProxy는 내장된 오류 페이지를 사용한다고한다.

 

기본 오류 페이지에는 http code가 들어있기때문에, 각 코드별 파일을 아래와같이 수정하였다.

 

<html><body><h1>잘못된 접근입니다.</h1> Error Page </body></html>

 

또한, vi /etc/haproxy/haproxy.cfg 파일에서 443요청에 대해 아래와 같이 설정을 추가하였다.

errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http

 

혹시 error code별 http코드가 보이지 않는다면 find / -name *.http로 haproxy의 error code http를 찾아서 위의 디렉토리에 cp하자.

 

여기까지 끝났다면 

 

systemctl restart haproxy  명령어를 날려주고

 

아까와 같이 curl 날려주면 아래와 같이 내가 만든 ERROR PAGE가 나오는 것을 확인할 수 있다.

 

우리는 apache를 별도로 web server를 사용하지 않고 haproxy를 사용하기에 이와같은 순서가 됬지만,

 

혹시 동일한 취약점의 경우인데 haproxy가 아니라면 사용하고있는 web server의 설정을 알아보고 설정하자.

 

반응형
반응형
마운트란, 파일 시스템을 사용하기 위해 디스크나 외부 저장장치를 특정 디렉토리에 연결하는 것을 말한다.

 

 

이를 통해 해당 디렉토리를 통해 저장 장치에 접근할 수 있다.

 

마운트할 때는 디스크를 마운트하는 것이 아니라, 파일 시스템을 마운트한다.(디스크에하는 줄)

 

파일 시스템은 여러 가지 타입이 있을 수 있으며,

 

이러한 파일 시스템들은 각각의 파일과 디렉토리를 어떻게 저장할지 결정한다.

 

마운트할 때는 해당 파일 시스템의 타입을 명시하고, 파일 시스템을 마운트할 마운트 포인트(디렉토리)를 지정한다.

 

윈도우 : 자동 인식
  • 윈도우에서는 새로운 저장 장치(USB 포함)를 연결하면 자동으로 해당 드라이브에 대한 마운트가 수행
  • 해당 드라이브의 파일 및 디렉토리에 쉽게 접근가능해짐
리눅스 : 수동 설정 필요

 


아래는 chat gpt와 나눈 대화이다. (각 각 리눅스와 윈도우)

 

Q. 만약에 내가 리눅스 서버에 새로 ssd를 추가했어. 그럼 처음부터 끝까지 어떤 과정을 거쳐야 사용할 수 있는지 자세하게 설명좀

A. 새로운 SSD를 추가해서 사용하려면 다음과 같은 과정이 필요합니다.

  1. 파티션 생성: 새로운 SSD를 사용하기 위해서는 먼저 파티션을 생성해야 합니다. 이 단계에서는 새로운 SSD에 대한 파티션을 생성하는 작업을 수행합니다. 파티션은 디스크의 논리적인 구획으로서, 디스크를 여러 개의 영역으로 나누어서 사용할 수 있도록 합니다.
  2. 파일 시스템 생성: 파티션을 생성한 후에는 해당 파티션에 파일 시스템을 생성해야 합니다. 파일 시스템은 운영체제에서 파일을 저장하고 관리하기 위한 방식을 의미합니다. 이 단계에서는 새로운 파티션에 대해 파일 시스템을 생성합니다.
  3. 마운트: 파일 시스템을 생성한 후에는 해당 파일 시스템을 마운트해야 합니다. 마운트는 파일 시스템을 운영체제의 디렉토리 구조에 연결하는 작업을 의미합니다. 이 단계에서는 생성된 파일 시스템을 운영체제의 디렉토리 구조에 연결하고, 해당 디렉토리를 통해 새로운 SSD에 접근할 수 있도록 설정합니다.
  4. 부팅 시 자동 마운트 설정: 위의 과정을 모두 마쳤다면 새로운 SSD를 사용할 수 있습니다. 그러나 매번 시스템을 부팅할 때마다 해당 SSD를 수동으로 마운트해야 한다면 번거로울 것입니다. 따라서, 부팅 시 자동으로 마운트 설정을 해주는 것이 좋습니다. 이를 위해서는 /etc/fstab 파일을 수정하여 자동 마운트 설정을 추가해주면 됩니다.

위의 과정을 통해, 새로운 SSD를 사용할 수 있게 됩니다.

 

Q. 그럼 윈도우는 디스크를 추가하면 어떻게 파일시스템을 생성해?

A. 윈도우에서 디스크를 추가하면, 해당 디스크에 파일 시스템을 생성하기 위해 다음과 같은 과정을 거칩니다.

  1. 디스크 관리 유틸리티 실행: 윈도우 운영체제에서는 "디스크 관리"라는 유틸리티를 이용하여 새로운 디스크를 사용할 수 있도록 준비합니다. 이 유틸리티는 "관리 도구" 폴더 안에 있습니다.
  2. 디스크 초기화: 디스크 관리 유틸리티에서 새로 추가한 디스크를 선택하고, 초기화 작업을 수행합니다. 초기화 작업은 디스크에 대한 파티션 정보를 생성하고, 파일 시스템을 준비합니다.
  3. 파티션 생성: 디스크를 초기화한 후, "새로운 단위 생성" 기능을 사용하여 디스크에 파티션을 생성합니다. 이 과정에서 파티션의 크기와 유형을 선택합니다.
  4. 파일 시스템 생성: 파티션을 생성한 후, 해당 파티션에 파일 시스템을 생성합니다. 이 때 NTFS 또는 FAT32와 같은 파일 시스템을 선택할 수 있습니다.
  5. 드라이브 문자 할당: 파일 시스템을 생성한 후, 해당 파티션에 할당된 드라이브 문자를 지정합니다. 이 때, 사용자가 지정한 드라이브 문자를 사용하거나, 시스템에서 자동으로 드라이브 문자를 할당할 수 있습니다.
  6. 마운트: 마지막으로, 윈도우 운영체제에서 해당 파티션을 마운트합니다. 이렇게 하면 파일 시스템이 해당 드라이브 문자에 연결되어 사용할 수 있게 됩니다.

 

마운트를 디스크를 사용하기 위한 정도로만 알고 있었는데,

 

마운트에 대해 gpt와 대화하다보니 디스크추가시 일련 과정을 알 수 있었다.

반응형
반응형

처음 thymeleaf를 사용해서 프로젝트를 작업하면서 정리해봤다. 생각나는게 있으면 추가해야지!

 

Thymeleaf data 속성 사용법(1개)
th:attr="data-userid=${변수명}"
Thymeleaf data 속성 사용법(2개 이상)
th:attr="data-userid=${변수명}, data-usernm=${변수명}"

콤마로 연결!

참고로 대문자를 사용하면(data-userId 혹은 userNm)

$(obj).data(”userId”)로 값을 가져오지 못하므로 소문자사용함.

 

Thymeleaf class추가하기 : classappend
th:classappend="${조건} ? '참인경우append할 클래스명':''"

 

Thymeleaf select option selected(예시 : 검색)
<select th:field="${searchData.searchType}">
	<option th:value="title" th:selected="${searchData.searchType} == 'title'">
	...
</select>

 

Thymeleaf radio checked
<input type="radio" name="gender" value="f" th:checked="${gender eq 'f'}">여성
<input type="radio" name="gender" value="m" th:checked="${gender eq 'm'}">남성

 

Thymeleaf checkbox checked
<input type="checkbox" th:checked="${xxxYn} eq 'Y'" name="xxxYn" /> 

 

Thymeleaf List(예시 : resultList)형태 foreach
<tr th:each="resultRow,idx : ${resultList}">
	<th th:text="${idx.count}"></th>
	<td th:text="${resultRow.title}"></td>
</tr>

 

Thymeleaf Map(예시 : resultMap)형태 foreach
<ul class="tree-group" th:each="entry, ii: ${reulstMap}">
	<li th:text="${entry.key}"></li> <!-- key 출력 -->
	<li th:text="${entry.value}"></li> <!-- value 출력 -->
</ul>

 

Thymeleaf onclick 변수 사용방법
th:onclick="'fn_paging('+${pagination.startPageNum}+');'"

 

Thymeleaf split(예시 : / 으로 잘라서 0번째 값 가져오기)
th:text="${#strings.arraySplit(변수, '/')[0]}"

 

Thymeleaf java LocalDateTime을 원하는 날짜형식으로 변환
<td th:text="${#temporals.format(regDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
반응형
반응형
org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call

 

JpaRepository 사용하여 delete를 하는데 해당 오류가 발생하였다. 

 

JPA에서는 데이터베이스 트랜잭션 내에서 작동한다고 한다. 

 

이렇게 작동하는 JPA는 트랜잭션은 커밋이나 롤백을 하지 않으면 영속성 컨텍스트에만 저장이된다.

(*** 영속성 컨텍스트 : JPA에서 엔티티 객체를 보관 및 관리하는 환경)

 

즉, 데이터베이스에 엔티티 객체가 저장이 되지 않는다.

 

@Transactional 어노테이션을 사용하면  JPA의 트랜잭션을 자동으로 시작하고, 커밋 또는 예외발생시 롤백 등을 수행할 수 있다.

 

그러므로 해당 오류는 delete하는 repository를 호출하는 서비스에서 @Transactional 어노테이션을 추가해주고 서버를 재기동해주니 삭제가 정상적으로 되는것을 확인하였다.

반응형
반응형
<if test="exVO.isYn == 'y'">

 

이부분에서 오류가나는데...

 

너무 오랜만에해서그런가.. 따옴표의 문제일줄은 몰랐다...

 

<if test='exVO.isYn == "y"'>

 

반응형
반응형

운영하는 서버에서 파일다운로드 받기위해 url요청을하면 다른서버의 파일다운로드 받아오는 부분에서 해당 오류가 발생하였다.

 

I/O error on POST request for "": Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out

 

구글링을 통해 여러방법을 몇시간 삽질했지만 나의 경우에는 해당 파일이 존재하지 않아서 발생하였다.

 

DB에 있는 파일정보의 파일인덱스를 요청해서 다운로드 요청한 것이었는데, 해당 파일이 당시 어떤 오류로인한 업로드처리가 안됬었던 모양.

 

리눅스서버의 파일업로드경로를 가보니 해당파일이 존재하지 않는것을 확인한 후..

 

서버에 존재하는 파일의 파일인덱스를 요청해서 확인해보니 다운로드가 잘되는 것을 확인하였다. 

 

결국 파일이 존재하지 않아서 다운로드할 파일이 없어서 타임아웃이 된 것이었다.

반응형
반응형

 

query did not return a unique result: 3

해당오류는 select 결과를 VOclass형태로 받는 부분에서 오류가 났다

 

VOclass return = repository.findByXXX(param);

 

select 결과가 row 수가 3인데 List<VOclass> 형태로 받지않고 VOclass로 받아서 생긴 오류였다.

 

만약에 select 결과가 여러 row를 받는게 맞으면 List<VOclass>형태로 타입을 변경해주면되고,

 

아니면 관련 여러 row가 나오지않도록 소스코드를 수정하고 필요없는 데이터는 삭제해주면된다.

 

반응형

+ Recent posts