80 port에 대하여 Root가 아닌 다른 계정으로 서비스 하기

보안 취약점으로 인해 서비스에 대한 기동을 root가 아닌 다른 계정으로 하라는 지침이 내려왔다.

하지만 1024 포트 이하에 대한 서비스 권한은 root만 가지고 있다. 기존에 했던 방법은 계정을 생성하고 root와 같은 그룹으로 묶어서 처리한 기억이 있다.

이번에 찾은 방법은 authbind라는 라이브러리를 이용 하는 방법이다.

예제는 pm2를 이용하였는데, 아마 생각은 다른 프로그램 역시 동작 할것이다.

우선 다음 명령어를 이용하여 authbind를 설치 하고 %user% 는 사용하려는 계정으로 바꿔서 진행하면 된다.

$> sudo apt-get install authbind
$> sudo touch /etc/authbind/byport/80
$> sudo chown %user% /etc/authbind/byport/80
$> sudo chmod 755 /etc/authbind/byport/80

그리고 변경해야 하는 내용은 사용하려는 서비스의 기동을 다음과 같이 하면 된다.

$> authbind --deep %명령어% 

일일이 치기 귀찮다면 다음과 같이 alias를 사용자 프로파일에 추가한다.

# ~/.bash 또는 ~/.zshrc
$> vi ~/.bash
# 가장 하단에 다음 내역 추가 
alias 명령어='authbind --deep 명령어'

# 프로파일 재반영
$> source ~/.bash

pm2를 예를 들면 다음과 같다.

# ~/.bash 또는 ~/.zshrc
$> vi ~/.bash
# 가장 하단에 다음 내역 추가 
alias pm2='authbind --deep pm2'

# 프로파일 재반영
$> source ~/.bash

pm2의 경우 update를 authbind를 이용하여 해야 한다.

$> authbind --deep pm2 update

추가적인 방법으로는 포트 포워딩을 이용하여 처리하는 방법도 있다.

참고자료


Posted by lahuman

Nginx private 인증서 적용하기

  • OPENSSL 기반으로 인증서요청서 생성하기
$> openssl req -new -newkey rsa:2048 -nodes -keyout <개인키이름>.key -out <인증요청서이름>.csr
... 정보 입력 or 걍 엔터
  • 인증서 생성 하기
$> openssl x509 -req -days 365 -in <인증요청서이름>.csr -signkey <개인키이름>.key -out <생성할인증서이름>.crt
... 결과로 인증서( 인증서이름.crt )가 생성된다.
  • 비밀번호 제거작업 필수는 아니지만, Nginx를 재기동 할 경우 비밀번호를 요청 받는다. 따라서 다음과 같이 개인키를 재생성 한다.
    $> cp <생성된개인키이름>.key <생성할개인키복사본이름>.key.secure
    $> openssl rsa -in <생성된개인키복사본이름>.key.secure -out <재생성할개인키이름>.key
    
  • Nginx SSL 적용
$> vi /etc/nginx/conf.d/<서비스명>.conf
... 추가
server {
        listen 443;
        server_name localhost;
        charset utf-8;
        access_log /etc/nginx/log/access.log;
        error_log /etc/nginx/log/error.log;
        ssl     on;                                               #ssl사용
        ssl_certificate /etc/nginx/ssl/인증서이름.crt;               #생성된 인증서경로
        ssl_certificate_key /etc/nginx/ssl/<재생성할개인키이름>.key;    #생성된 개인키
        location / {
                proxy_redirect  off;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Scheme $scheme;
                proxy_pass http://target-server;
        }
}

끝!

참고 주소에 가면 더 많은 정보가 있다.

참고 주소


Posted by lahuman

오랜만에 JAVA로 개발 했다.

Node에서 Oracle JDBC에 연결을 하려는데 기존 버젼과 충돌이 발생하였다.

이를 해결하기 위해 기존 버젼을 변경에 따르는 사이드 임펙트를 알지 못하기에, JAVA를 이용하기로 하였다.

문제는 MAVEN에서 ojdbc 관련해서 dependency를 설정해도 가져오지를 못했다. 망할 오라클이 문제인가…

우여곡절 끝에 해당 jar 파일을 다운 받아 dependency를 다음과 같이 설정 하였다.

# pom.xml
...생략
<dependency>
    <groupId>oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.3</version>
    <scope>system</scope>
    <systemPath>file://${project.basedir}/lib<systemPath>
</dependency>
...생략

이렇게 처리 할 경우, 패키징을 할때 해당 jar 파일이 함께 배포 되지 않는다.

이럴때 쉬운 방법으로 로컬 저장소를 이용하면 된다.

먼저 pom.xml에 로컬 저장소를 다음과 같이 추가한다.

# pom.xml
...생략
<dependency>
    <groupId>oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.3</version>
</dependency>
...생략
<repositories>
    <repository>
        <id>local-repository</id>
        <name>local repository</name>
        <url>file://${project.basedir}/lib</url>
    </repository>
</repositories>
...생략

이후 해당 디렉토리에 jar를 다음과 같은 형태로 추가 한다.

Local Repository
# 아래과 같은 형식으로 디렉토리 구조를 만들어야 한다.
lib/
  {groupId}/
    {ojdbc6}/
      {version}/
        ojdbc6-11.2.0.3.jar

마지막으로, 신나게 패키징을 하려는데 무료 IntelliJ를 써서 제대로 지원이 안되나 보다.

mvn install spring-boot:repackage

... 생략
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.1.1.RELEASE:repackage (default-cli) on project simple-api: Execution default-cli of goal org.springframework.boot:spring-boot-maven-plugin:2.1.1.RELEASE:repackage failed: Source file must be provided -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException

이걸 해결 하기 위해서 RUN > Edit Configuration창을 열어서 Maven Run을 추가 했다.

RUN > Edit Configuration

명령어에 mvn을 넣으면 안된다.

# -U 옵션은 로컬 리포지토리 사용시 추가하는 옵션이다.
package spring-boot:repackage -U

오늘의 삽질 끝~

새해복 많이 받자!

참고 자료


Posted by lahuman

mysql] max_allowed_packet 관련 오류

max_allowed_packet에 대한 설명은 다음과 같다.

통신 패킷은 MySQL 서버로 전송되는 단일 SQL 문, 클라이언트로 전송되는 단일 행 또는 마스터 복제본 서버에서 슬레이브로 전송되는 바이너리 로그 이벤트입니다. MySQL 8.0 서버 또는 클라이언트에서 전송할 수 있는 가장 큰 패킷은 1GB입니다.

패킷이라고 나오지만 실제 통신에서 전달되는 크기이다.

이 값은 기본이 16M으로 되어 있으나, 대용량 처리로 인하여 값을 변경해야 할 수 있다. 변경은 my.cnf의 설정에서 다음을 변경하면 된다.(128M로 변경 샘플)

[mysqld]
max_allowed_packet=128M

변경 내역을 반영하려면, 서버를 재기동하거나 다음의 명령어로 재기동 없이 반영 가능하다.

# mysql 설치 위치

> ./bin/mysqladmin -h 127.0.0.1 -u root -p reload

참고 자료


Posted by lahuman

MongoDB 3.2.20 Authentication Setting

MongoDB 3.2.20 버젼으로 진행된다. 설치와 cluster가 완료 되었다는 가정하에 진행이 된다. 또한 ElasticSearch와 MongoDB는 mongo-connect를 이용하여 연결 되어 있다.

고객사의 요청으로 MongoDB 접근에 대한 권한을 설정해야 하는 일이 생겼다.

간단하게 설정으로 해결되는 문제로 생각했는데 삽질이 컸다.

현재 MongoDB의 구조는 다음과 같다.

MongoDB Architecute

총 5대의 서버로 구성되어 있으며, 2대는 데이터를 적재하는 MongoDB, 1대는 Primary/Slave의 투표를 하는 ARBITER, 클러스터의 메타 데이터 및 구성 설정을 저장하는 config 서버, 마지막으로 클라이언트 응용 프로그램과 공유 된 클러스터 사이의 인터페이스를 제공하는 쿼리 라우터 역할 하는 mongos로 구성된다.

인증을 위한 KeyFile 생성

MongoDB는 다음 2가지 인증 매커니즘을 지원 합니다.

본 글에서는 간단하게 사용이 가능한 SCRMA을 이용합니다

키 생성 명령어

openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>

생성된 키를 각 설정 파일에 설정 해야 한다.

security:
  keyFile: <path-to-keyfile>
replication:
  replSetName: <replicaSetName>
net:
   bindIp: localhost,<ip address>

Server-A(20001), Server-B(20002), Server-C(20003), Server-D(20004)의 설정파일에 security: keyFile: 이 모두 설정되어야 한다. Server-F(10001)는 실행시 option으로 처리 한다.

재기동 옵션 A~D, F

/usr/bin/mongod --config /etc/mongod_repl1.conf
/usr/bin/mongod --config /etc/mongod_repl2.conf
/usr/bin/mongod --config /etc/mongod_repl3_arbiter.conf
/usr/bin/mongod --config /etc/mongod_repl4_config.conf --configsvr
/usr/bin/mongos --configdb localhost:20004 --port 10001 --fork --logpath /var/lib/mongodb/mongod_mongos.log --chunkSize 1 --keyFile /etc/m_key

MongoDB 재기동 & 계정 생성

설정이 완료된 이후에 MongoDB를 재기동 한다.

재기동이 완료 되면 계정을 생성 한다.

여기서는 단순하게 계정을 생성 하도록 한다. 계정 생성은 mongos와 repl1에 모두 생성 해야 한다.

  1. mongos 설정 ~~~ $> mongo –port 10001

use admin; db.createUser( { user: “admin”, pwd: “1234”, roles: [ { role: “root”, db: “admin” } ] } );

2. repl1 설정

$> mongo –port 20001

use admin; db.createUser( { user: “admin”, pwd: “1234”, roles: [ { role: “root”, db: “admin” } ] } );

3. mongo-connector 실행(생성한 계정의 id/pw를 option에 추가 한다.)

/usr/bin/python /usr/bin/mongo-connector -m localhost:10001 -t localhost:9200 -d elastic2_doc_manager -a admin -p 1234 ~~~

테스트

계정 처리가 완료 되면, 데이터를 조회/삽입 해본다.

$> mongo --port 10001

mongos> db.test.find({})
Error: error: {
	"ok" : 0,
	"errmsg" : "not authorized on test to execute command { find: \"test\", filter: {} }",
	"code" : 13
}
mongos>
mongos> use admin
switched to db admin
mongos> db.auth("admin", "1234")
1
mongos> db.test.find({})
mongos> db.test.insert({"x":1, "y":10})
WriteResult({ "nInserted" : 1 })
mongos> db.test.find({})
{ "_id" : ObjectId("5b6b76a593ec1b18e1f5f441"), "x" : 1, "y" : 10 }

참고자료


Posted by lahuman

INT4 형식으로 저장된 IP 값을 Function을 이용하여 처리 하기

IP를 postgresql에 저장을 할때 문자열로 저장을 하기도 하지만, Network Address Types으로 제공도 된다.

NameStorage SizeDescription
cidr7 or 19 bytesIPv4 and IPv6 networks
inet7 or 19 bytesIPv4 and IPv6 hosts and networks
macaddr6 bytesMAC addresses

또한 다른 방식으로는 int8로 저장이 되기도 한다.

문제는 int4 형식으로 저장되었을 경우이다.

이 경우에는 음수값에 대하여 IP 형식으로 표출하기 위해서는 int4보다 큰 양수 형식으로 변환하여 표시 해야 한다.

간단하게 function을 이용하여 만들어 보았다.

create or replace function int2ip(intVal integer)
returns TABLE(
    ipVal text
)
as $$
begin
    if intVal < 0 then
      return QUERY SELECT ('0.0.0.0'::inet + ((2147483649+intVal)::bigint+2147483647::bigint))::text;
      -- return QUERY SELECT '0.0.0.0'::inet + ( 'x' || to_hex(intVal))::bit(32)::bigint
    else
      return QUERY SELECT ('0.0.0.0'::inet + intVal)::text;
    end if;
    
end; $$
language 'plpgsql';


-- 211.115.106.210
select int2ip(-747410734);

결과

int2ip
211.115.106.210/32

postgresql을 설치 하지 않고도 온라인에서 간단하게 테스트 하는 사이트를 이용하였다..

참고 사이트


Posted by lahuman

SpringBoot에서 Websocket 사용하기

Websocket 이란?

서버와 클라이언트 사이에 양방향 통신 채널을 구축할 수 있는 통신 프로토콜이다. 동작 방식은 먼저 HTTP 통신을 연결하고 이후 Upgrade 헤더를 보내 양방향 연결로 업그레이드한다. Websocket은 최신 브라우저에서는 대부분 지원한다.

전체 소스는 참고 내역에 있는 소스를 확인하면 된다.

주요 설정은 다음과 같다.

1. WebSocket Configuration

package com.example.websocketdemo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableSimpleBroker("/topic");
    }
}

@EnableWebSocketMessageBroker 은 websocket 서버를 사용한다는 설정이다. 또한 WebSocketMessageBrokerConfigure를 상속 받아 몇몇 메소드를 구현하여 websocket 연결 속성을 설정한다. registerStompEndpoints를 이용하여 클라이언트에서 websocket에 접속하는 endpoint를 등록한다. withSockJS()를 이용시에는 브라우져에서 websocket을 지원하지 않을 경우 fallback 옵션을 활성화 하는데 사용됩니다.

메소드 이름에 STOMP(Simple Text Oriented Messaging Protocol)라는 단어가 있다. 이는 스프링프레임워크의 STOMP 구현체를 사용한다는 의미다. STOMP가 필요 한 이유는 websocket은 통신 프로토콜이지 특정 주제에 가입한 사용자에게 메시지를 전송하는 기능을 제공하지 않는다. 이를 쉽게 사용하기 위해 STOMP를 사용한다.

두변째 메소드configureMessageBroker는 한 클라이언트에서 다른 클라이언트로 메시지를 라우팅 할 때 사용하는 브로커를 구성한다. 첫번째 라인에서 정의된 /app로 시작하는 메시지만 메시지 헨들러로 라우팅한다고 정의한다. 두번째 라인에서 정의된 /topic로 시작하는 주제를 가진 메시지를 핸들러로 라우팅하여 해당 주제에 가입한 모든 클라이언트에게 메시지를 방송한다.

2. ChatController

package com.example.websocketdemo.controller;

import com.example.websocketdemo.model.ChatMessage;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.stereotype.Controller;

@Controller
public class ChatController {

    @MessageMapping("/chat.sendMessage")
    @SendTo("/topic/public")
    public ChatMessage sendMessage(@Payload ChatMessage chatMessage) {
        return chatMessage;
    }

    @MessageMapping("/chat.addUser")
    @SendTo("/topic/public")
    public ChatMessage addUser(@Payload ChatMessage chatMessage, 
                               SimpMessageHeaderAccessor headerAccessor) {
        // Add username in web socket session
        headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
        return chatMessage;
    }

}

@MessageMapping는 클라이언트에서 보내는 메시지를 매핑한다. 호출 되는 주소는 /app/chart.addUer/app/chat.sendMessage가 된다.

3. main.js

javascript 에서 실제 사용은 다음 같이 사용한다.

function connect(event) {
    username = document.querySelector('#name').value.trim();

    if(username) {
        usernamePage.classList.add('hidden');
        chatPage.classList.remove('hidden');

        var socket = new SockJS('/ws');
        stompClient = Stomp.over(socket);

        stompClient.connect({}, onConnected, onError);
    }
    event.preventDefault();
}


function onConnected() {
    // Subscribe to the Public Topic
    stompClient.subscribe('/topic/public', onMessageReceived);

    // Tell your username to the server
    stompClient.send("/app/chat.addUser",
        {},
        JSON.stringify({sender: username, type: 'JOIN'})
    )
    connectingElement.classList.add('hidden');
}

.... 중략

connect를 통해 클라이언트는 websocket을 연결 합니다. 연결에 성공하면 /topic/public 주제에 가입하여 메시지를 주고 받습니다.

참고 내역


Posted by lahuman

면접 질문 

1. 객체지향 개발 5대 원리: SOLID

- 기본중의 기본! 기본은 늘 중요 하니까!!!

2. SpringFramework 의 중요 컨셉 3가지

1) IOC : 제어의 역전 / 의존성 주입
2) AOP : 관심의 분리
3) PSA : 일관성 있는 추상화

3. CSS 선택자 종류와 속도

1) 전체 선택자
2) 태그 선택자
3) 클래스 선택자
4) 아이디 선택자
5) 복합 선택자
6) 속성 선택자
7) 가상 클래스 선택자
8) 기타(언어, 부정, 목적, UI요소)

4. JPA를 사용하면서 어려운점

1) 영속성 이해
2) 다중 JOIN QUERY
3) 관계 DB와 객체 지향적 DB 설계

5. MSA 관련

1) Eureka
2) Zuul
3) Histrix 
4) 서킷 브레이커 등

6. CQRS란 무엇인가?

7. 데이터베이스 Isolation Level

8. 업무 능력이 떨어지는 동료와 일할 경우 어떻게 대처할 것인가?

참고 자료

  1. 객체지향 개발 5대 원리: SOLID
  2. Spring 의 시작, 프레임워크의 구성요소와 동작원리
  3. CSS: 선택자(Selector) 이해
  4. CQRS란 무엇인가?
  5. 데이터베이스 Isolation Level


Posted by lahuman

MongoDB] 설치 & 권한 설정

CentOS 7에서 MongoDB를 설치하고 권한을 설정하여 권한이 없는 사용자는 조회/등록/수정/삭제 기능을 사용하지 못하게 한다. MongoDB는 3.6 버젼 기준으로 설명한다.

1. 패키지 매니저에 MongoDB 추가

먼저 /etc/yum.repos.d/mongodb-org-3.6.repo 파일을 생성하고 다음 내역을 추가 한다.

[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc

2. MongoDB 설치

MongoDB 패키지 설치를 진행 한다.

sudo yum install -y mongodb-org

설치가 완료 되면 mongod 프로세스를 시작한다.

sudo service mongod start

프로세스에 대한 정지 명령어는 다음과 같다.

sudo service mongod stop

만약 MongoDB를 삭제 하려면, mongod 프로세스를 정지 하고 mongodb 패키지를 삭제 한다.

sudo yum erase $(rpm -qa | grep mongodb-org)

설치가 완료 되었으면 설치된 MongoDB로 접속 하여 테스트를 진행 한다.

mongo --host 127.0.0.1:27017

3. MongoDB 사용자 추가

먼저 admin 권한을 설정한다.

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

MongoDB 서비스를 재시작 하고, 접속시 로그인을 해보자

# 접속시 ID/PW 작성
mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

# 접속후 Login
mongo --port 27017
use admin
db.auth("myUserAdmin", "abc123" )

# 계정 추가
use test
db.createUser(
  {
    user: "myTester",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "reporting" } ]
  }
)

하지만 아직까지는 Login을 하지 않아도 조회/등록등의 기능이 가능하다.

4. MongoDB 권한 설정

/etc/mongod.conf 설정 파일에서 다음 항목을 수정한다.

security:
    authorization: "enabled"

MongoDB 서비스를 재기동 하고 접속 테스트를 한다.

sudo service mongod restart

로그인 이후에 데이터 조회나 등록을 하려고 하면 권한이 없다는 메시지가 표출 된다.

mongo --port 27017

> db.test.insert( {x:1, y:1} )
WriteResult({
	"writeError" : {
		"code" : 13,
		"errmsg" : "not authorized on test to execute command { insert: \"test\", ordered: true, $db: \"test\" }"
	}
})
> db.test.find( {} )
Error: error: {
	"ok" : 0,
	"errmsg" : "not authorized on test to execute command { find: \"test\", filter: {}, $db: \"test\" }",
	"code" : 13,
	"codeName" : "Unauthorized"
}
# 로그인 진행
> db.auth('myTester', 'xyz123')
1
> db.test.find( {} )
{ "_id" : ObjectId("5b0b8c26efefcbe94ba75c29"), "x" : 1, "y" : 1 }
> db.test.insert( {x:1, y:1} )
WriteResult({ "nInserted" : 1 })
> db.test.find( {} )
{ "_id" : ObjectId("5b0b8c26efefcbe94ba75c29"), "x" : 1, "y" : 1 }
{ "_id" : ObjectId("5b0b8d6753b23794e42015e9"), "x" : 1, "y" : 1 }

참고 자료


Posted by lahuman

QRadar SDK를 Ubuntu 16.x에서 사용하기 위한 모듈 교체 작업

먼저 QRadar SDK를 받아야 한다.

설치는 간단하게 압축을 해제 하고 install.sh 을 실행하면된다.

설치 하고 나서 이후 의존성 문제로 qradar_app_creator 명령어를 실행하면 오류가 발생한다.

Python 버젼은 2.7.9 이상이라고 되어 있지만 기본적으로 2.7.15가 설치 되어 있다. 상위 버젼이면 호환성에 문제가 없을 것이라 생각했지만, 모듈 오류가 많이 발생하므로 2.7.9를 설치하자

Python 설치에 필요한 모듈을 함께 설치 한다.

sudo apt-get install python-pip python-dev
sudo apt-get install build-essential
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev

wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
tar -xvf Python-2.7.9.tgz
cd Python-2.7.9/
 ./configure --enable-unicode=ucs4  # 추후 pycrypto 모듈 관련 오류 발생을 예방하기 위해 --enable-unicode=ucs4  처리를 한다.
make
sudo make install
sudo shutdown now -r

qradar_app_creator 명령어를 입력하면 몇개의 모듈이 해당 시스템을 지원하지 않는다는 메시지를 확인 할수 있다.

관련해서 pip download 를 이용해 해당 모듈을 수동으로 교체 한다.

pip download cffi==1.11.5
sudo cp cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl /usr/local/etc/QRadarAppSDK/src_packages/

pip download cryptography==1.8.1
sudo cp cryptography-1.8.1.tar.gz /usr/local/etc/QRadarAppSDK/src_packages/

pip download pycrypto==2.6.1
sudo cp pycrypto-2.6.1.tar.gz /usr/local/etc/QRadarAppSDK/src_packages/

# 더 있을 경우 pip download를 이용해서 받아 /usr/local/etc/QRadarAppSDK/src_packages/로 옮긴다.

마지막으로 실행 스크립트에서 교체된 모듈의 이름을 변경한다.

sudo vi /usr/local/bin/qradar_app_creator

# 모듈 명을 바뀐 파일로 변경하면 된다.
"|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|workspace"

모듈 교체는 어려운 작업은 아니지만, 하나한 확인해야 하므로 손이 많이 간다.

참고 주소


Posted by lahuman