: NiFi 서버의 로그인 방식은 LDAP, Kerberos, OpenID Connect, Apache Knox에서 하나를 선택하여 구성할 수 있다(다음 링크 참조: https://nifi.apache.org/docs/nifi-docs/html/administration-guide.html#user_authentication). 이 네가지 방식중에서 OpenID Connect(다음 링크 참조: https://openid.net/connect/) 로그인 방식을 택한것은 별도의 추가적인 인증 서버 설치 및 관리가 필요없어서 관리의 부담이 적고, 설정 자체가 네가지 방식 중에 가장 단순하기때문이다.

(1) Google API 프로젝트 생성 : OpenID Connect 방식의 로그인을 사용하기위해서 Google API를 사용할 것이므로 Google API용 프로젝트를 먼저 생성해야 한다.

a. 아래 링크를 통해 Google API로 접속을 한다.

https://console.developers.google.com/apis

b. (그림 1. Google API Dashboard)와 같이 새 프로젝트를 생성하기 위해 1)의 빨간색 박스 영역을 클릭한다.

(그림 1. Google API Dashboard)

c. (그림 2. 새프로젝트 생성)과 같이 1)의 "새 프로젝트"를 클릭한다.

※ NiFi 서버용 프로젝트(nifi-fitogether)가 이미 생성이 되어 있는 상태이지만 새 프로젝트를 생성하는 방법을 보여주기 위함이다.

(그림 2. 새프로젝트 생성)

d. (그림 3. 새 프로젝트 설정)에서 1) 프로젝트명을 입력 2) "만들기" 버튼을 클릭한다.

(2) OAuth 동의 화면 설정

(그림 4.1. OAuth 동의 화면 설정)

1) 좌측 메인 메뉴에서 "OAuth" 동의 화면을 클릭한다.

2) "UserType"에서 "내부"를 선택한 후, "만들기" 버튼을 클릭한다. "만들기" 버튼을 클릭하면 OAuth 동의 화면의 상세 항목 페이지로 이동한다.

 

(그림 4.1. OAuth 동의 화면 상세)

1) 애플리케이션 이름을 적절하게 입력한다.

2) OAuth 인증을 사용하기 위한 승인된 도메인을 입력하고 엔터키를 누른 후, 맨 하단의 저장 버튼을 클릭한다.

 

(3) 클라이언트 ID 생성

(그림 5.1. 사용자 인증 정보 생성)

1) 좌측의 메인 메뉴에서 "사용자 인증 정보"를 클릭한다.

2) 사용자 인증 정보를 생성하기 위해서 상단의 "사용자 인증 정보 만들기"를 클릭한다.

3) "OAuth 클라이언트 ID"를 클릭한다.

 

(그림 5.2. 애플리케이션 유형 선택)

1) 애플리케이션 유형 항목에서 "웹 애플리케이션"을 선택한다.

2) 이름 항목에 적절한 이름을 입력한 후, "생성" 버튼을 클릭한다.

 

(그림 5.3. OAuth 클라이언트 생성 후 팝업)

: OAuth 클라이언트 생성 직 후, 위와 같은 팝업이 뜨는데 "클라이언트 ID"와 "클라이언트 보안 비밀번호"를 copy해서 보관해둔다.

 

(그림 5.4. OAuth 클라이언트 ID 목록)

1) 생성된 OAuth 클라이언트 ID를 설정하기 위해 클라이언트 ID 목록에서 이름 항목을 클릭한다.

 

(그림 5.5. OAuth 클라이언트 ID 설정)

1) 이름 항목에 이름을 적절하게 입력한다.

2) URI 버튼을 클릭해서 아래 URI 주소를 입력한 후, "저장" 버튼을 클릭한다.

https://xxx.xxxx.com/nifi-api/access/oidc/callback

 

(4) nifi.properties 설정 : Google 클라이언트 ID를 이용한 OpenID Connect 방식의 로그인을 위해 nifi.properties(파일 위치: /home/ubuntu/app/nifi-1.11.4/conf)에 아래와 같이 설정을 추가한다.

(그림 6. nifi.properties에 OpenID Connect 설정)

1) OpenID Connect Provider 검색 URL을 "nifi.security.user.oidc.discovery.url" 프로퍼티의 값으로 입력한다.

2) (그림 5.3. OAuth 클라이언트 생성 후 팝업)에서 copy하여 보관한 클라이언트 ID를 "nifi.security.user.oidc.client.id" 프로퍼티의 값으로 입력한다.

3) (그림 5.3. OAuth 클라이언트 생성 후 팝업)에서 copy하여 보관한 클라이언트 보안 비밀번호를 "nifi.security.user.oidc.client.secret" 프로퍼티의 값으로 입력한다.

 

(5) authorizers.xml 파일 설정 : OpenID Connect 로그인을 위한 접근 권한을 부여하기 위해 authorizers.xml(/home/ubuntu/app/nifi-1.11.4/conf) 파일을 아래와 같이 수정한다.

(그림 7. authorizers.xml에 접근 권한 설정)

: 1), 2)에 Google OAuth 클라이언트 ID를 생성할 때 로그인한 Google 이메일 계정을 입력한 후, 파일을 저장한다.

 

(6) 로그인 테스트

a. NiFi 서버를 stop and start 시킨다.(/home/ubuntu/app/nifi-1.11.4/bin/nifi.sh stop, /home/ubuntu/app/nifi-1.11.4/bin/nifi.sh start)

b. NiFi 서버(https://xxx.xxxxx.com/nifi)로 다시 접속을 한다.

c. 아래와 같이 로그인을 위해 구글 계정을 선택 또는 입력하는 화면에서 authorizers.xml에 등록한 구글 계정을 선택 또는 입력한다.

(그림 8. 구글 계정 선택 또는 입력)

d. 아래와 같이 입력한 구글 계정의 비밀번호를 입력한다.

(그림 9. 구글 계정의 비밀번호)

e. 아래와 같이 NiFi 캔버스가 오픈되고, 좌측 상단에 구글 이메일 계정이 보이면 정상적으로 로그인이 된것이다.

(그림 10. OpenID Connect 방식으로 로그인 한 화면)

: 로그인에 성공하면 1)과 같이 구글 계정이 표시된다. 로그 아웃을 하기 위해서는 1)에서 "LOG OUT" 링크를 클릭하면 정상적으로 로그 아웃된다. "LOG OUT" 링크를 클릭했을때 자동으로 다시 로그인이 된다면 구글 사이트로 이동해서 구글 계정 자체를 로그아웃한 다음에 다시 한번 시도한다.

'Open source > Apache NiFi' 카테고리의 다른 글

Apache NiFi에 SSL 적용  (0) 2021.07.09

: NiFi 서버에 로그인 화면을 적용하기 위해서는 SSL 연동이 필수이다. 현재(2020년 5월 12일 기준) EC2에 생성된 NiFi 서버의 SSL 인증서는 Self Signed Certificate을 사용하였으며, OpenSSL 툴을 사용하지 않고 좀 더 빠르게 Self Signed Certificate을 생성하기 위해 TinyCert(https://www.tinycert.org/)를 이용하였다.

(1) 인증서 생성 : NiFi 서버에 SSL 설정을 하기 위해서는 먼저 TinyCert 에서 CA 인증서와 서버 인증서를 생성 및 다운로드해야하는데 절차는 다음과 같다.

a. TinyCert에 접속하여 먼저 Sing Up을 한다. Email Address와 Password, Passphrase를 입력 해야 하는데 Passphrase는 서버 인증서를 NiFi 서버에 구성할때 필요하므로 기억을 해야한다.

b. TinyCert에 로그인이 된 상태에서 아래 (그림 1. CA 생성)에서와 같이 메인 화면에서 CA 인증서를 생성한다.

(그림 1. CA 생성)

1) "Create" 버튼을 클릭하여 CA 인증서를 생성한다. CA 인증서 항목은 적절하게 입력해주면 된다.

 

c. 서버 인증서 생성

(그림2. 서버 인증서 생성)

1) "Create" 버튼을 클릭해서 서버 인증서를 생성한다. 서버 인증서 항목은 적절하게 입력해주면 된다.

 

d. CA 다운로드

(그림3. CA 다운로드)

1) "다운로드" 버튼을 클릭해서 CA 인증서를 다운로드한다.

 

e. 서버 인증서 다운로드

(그림 4.1. 생성된 서버 인증서 목록)

1) 생성된 서버 인증서 목록을 클릭한다.

 

(그림 4.2. 생성된 서버 인증서 상세)

1) "다운로드" 버튼을 클릭해서 서버 인증서를 다운로드 버튼을 클릭한다.

2) 서버 인증서 타입을 "PKCS#12 Archive" 타입으로 선택하면 서버 인증서가 다운로드 된다. 

 

(2) NiFi 서버에 인증서 업로드 : 로컬 PC에 다운로드 받은 CA 인증서와 서버 인증서를 AWS EC2에 설치된 NiFi 서버쪽으로 업로드를 해야하는데 이를 위해서는 EC2 인스턴스에 해당하는 Private Key가 필요하다. Private Key는 개발 담당자(2020년 5월 12일 기준: 황정식)에게 문의한다. 아래 링크의 문서를 참조해서 다운로드 받은 CA 인증서와 서버 인증서를 NiFi 서버쪽으로 업로드한다.

a. SCP 파일 전송 관련 문서 : https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html

b. 현재(2020년 5월 12일 기준) 업로드된 CA 인증서와 서버 인증서의 디렉토리 경로는 (그림 5. CA 인증서와 서버 인증서의 디렉토리 경로)와 같다.

(그림 5. CA 인증서와 서버 인증서의 디렉토리 경로)

1) CA 인증서와 서버 인증서가 위치한 디렉토리 경로이다.

2) 로컬 PC에서 업로드 된 CA 인증서이다.

3) 로컬 PC에서 업로드 된 서버 인증서이다.

(3) Truststore 생성 :  NiFi 서버는 SSL 설정을 위해서 서버 인증서와 추가적으로 Truststore를 생성해야하는데 Truststore는 로컬 PC에서 업로드한 CA 인증서를 이용해서 (그림 6. Truststore 생성)과 같이 생성할 수 있다.

(그림 6. Truststore 생성)

1) <ca_file> 부분은 로컬 PC에서 업로드한 CA 인증서 파일명이며, <password>에는 패스워드를 입력하면 된다. 설정된 패스워드에 대해서는 개발 담당자(2020년 5월 12일 기준: 황정식)에게 문의한다.

(4) nifi.properties 설정 : nifi.properties 파일을 열어서 SSL 포트, KeyStore, Truststore 설정을 해준다.

a. HTTPS 설정 : NiFi 서버는 http와 https를 동시에 운용할 수 없기때문에 (그림7.1. HTTPS 설정)과 같이 프로퍼티 값을 수정한다.

(그림 7.1. HTTPS 설정)

1) "nifi.remote.input.secure" 프로퍼티의 값을 "true"로 수정한다.

2) "nifi.remote.input.http.enabled" 프로퍼티의 값을 "false"로 수정한다.

3) "nifi.web.https.port" 프로퍼티의 값을 "9443"으로 수정한다. NiFi의 https 디폴트 포트는 9443이다.

4) 그림 7.1에는 빨간 박스로 표시 되어 있지만 "nifi.web.https.host" 프로퍼티의 값으로 NiFi 서버와 매핑된 도메인을 입력해야지만 다음 글에서 설명하는 OpenID Connect 방식의 로그인을 사용할 수 있다.

b. KeyStore 및 Truststore 설정: CA 인증서를 이용해서 생성한 Truststore와 서버 인증서 설정을 (그림 7.2. KeyStore 및 Truststore 설정)과 같이 추가한다.

(그림 7.2. KeyStore 및 Truststore 설정)

1) "nifi.security.keystore" 프로퍼티의 값으로 서버 인증서의 경로를 입력한다.

2) "nifi.security.keystoreType" 프로퍼티의 값으로 "PKCS12"를 입력한다.

3) "nifi.security.keystorePasswd" 프로퍼티의 값으로 TinyCert에서 Sign up 시, 등록한 passphrase 값을 입력한다.

4) "nifi.security.truststore" 프로퍼티의 값으로 CA 인증서를 이용해서 생성한 Truststore의 경로를 입력한다.

5) "nifi.security.truststoreType" 프로퍼티의 값으로 "JKS"를 입력한다.

6) "nifi.security.truststorePasswd" 프로퍼티의 값으로 Truststore를 생성할 때 설정한 패스워드를 입력한다.

(5) hosts 파일 설정 : NiFi 서버에 접속하는 사용자는 (6)에서 설명할 도메인을 통해서 NiFi 서버에 접속을 할 수 있는데, 이 도메인은 EC2에서 추가한 외부 IP인 탄력적 IP와 매핑이 되어 있다. 하지만 NiFi 서버 입장에서는 EC2 인스턴스 내부 IP와 매핑이 되어야하므로 hosts 파일에 매핑 정보를 추가해주어야 한다. 

a. hosts 파일의 경로 : /etc/hosts

b. 내부 IP는 "hostname -I" 명령어로 확인 가능하며, NiFi 서버가 설치된 EC2 인스턴스의 내부 IP는 "172.31.34.156" 이다.

b. (그림 8. 도메인과 내부 IP 매핑 정보)와 같이 매핑 정보를 추가해준다.

1) EC2 인스턴스의 내부 IP와 도메인 매핑 정보를 hosts 파일에 추가한다.

(6) 접속 테스트

a. nifi.sh 명령을 사용해 NiFi 서버를 가동 시킨다. nifi.sh 전체 명령어는 아래와 같다.

 ubuntu@ip:~/app/nifi-1.11.4$ pwd
/home/ubuntu/app/nifi-1.11.4
ubuntu@ip:~/app/nifi-1.11.4$ bin/nifi.sh start

 

b. 아래 주소로 접속을 해본다.

https://도메인:9443/nifi

1) NiFi 서버쪽에 정상적으로 접속이 되지 않는 이유는 NiFi 서버는 SSL 설정이 완료되면 추가적으로 로그인 설정을 해주어야 한다. 접속 시, 발생하는 에러는 SSL 설정은 되어 있으나 로그인 설정이 되어 있지 않았기때문에 발생하는 에러이다.

다음 글에서는 NiFi 로그인 인증 방식중에 하나인 OpenID Connect 설정을 해보겠습니다.

'Open source > Apache NiFi' 카테고리의 다른 글

OpenID Connect 방식의 로그인 연동  (3) 2021.07.09

We just need to include the mybatis-x.x.x.jar file in the classpath to use MyBatis.

We can download it at "https://github.com/mybatis/migrations/releases".

If we will use Maven, we just add the following dependency to our pom.xml


==== pom.xml ====

<dependency>

  <groupId>org.mybatis</groupId>

  <artifactId>mybatis</artifactId>

  <version>x.x.x</version>

</dependency>

: we can find the above source code at "http://mvnrepository.com/".


1. Setting the configuration XML file

The configuration XML file contains settings for the core of the MyBatis system, including a DataSouce for acquiring database connection instances. 

Here is simple example.


==== mybatis.xml ====

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd">


<configuration>

    <!-- Elements should be coded keeping order. -->

   

    <!-- including a property's file -->

    <properties resource="mybatis.properties" />


    <typeAliases>

        <typeAlias alias="GoodsCmnDto" type="com.world.test.dto.GoodsCmnDto"/>

    </typeAliases>

    

    

    <!-- the setting of Database Connection -->

    <environments default="development">

        <environment id="development">

            <transactionManager type="JDBC" />

            <dataSource type="POOLED">

                <property name="driver" value="${driver}" />

                <property name="url" value="${url}" />

                <property name="username" value="${username}" />

                <property name="password" value="${password}" />


            </dataSource>

        </environment>

    </environments>

   

    <!-- sql Mappers -->

    <mappers>

        <mapper resource="com/mobile/test/service/sqlmapper/GoodsCmnSql.xml" />

    </mappers>

 

</configuration>



2. Acquiring a SqlSession from SqlSessionFactory

We should define a Class, SqlMapClient to acquire a sql session from SqlSessionFactory like the following.


==== SqlMapClient.java ====

package com.mobile.mybatis;


import java.io.IOException;

import java.io.Reader;


import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;


public class SqlMapClient {

private static SqlSession session;

    

    public static SqlSession getSqlSession() {

    try {

             String resource = "mybatis.xml";

             Reader reader = Resources.getResourceAsReader(resource);

             SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);

              

             session = sqlMapper.openSession();

              

         } catch (IOException e) {

             e.printStackTrace();

         }

     

        return session;

    }

}



3. Mapping sql statements.

==== sampleSql.xml ====

<?xml version="1.0" encoding="UTF-8" ?>

 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


 <mapper namespace="Test">

 

     <select id="getTeam" resultType="hashmap">

             SELECT

  

BD_CD AS CODE,

    BD_NM AS NAME

    FROM

 ESTB102

    WHERE

 CAMP_FG = '1'

          ORDER BY BD_NM

     </select>

 </mapper>

: Actually, it's very simple. We just define an id attribute and resultType.



4. Calling the method against the Mapper interface

==== SampleController.java ====

package com.mobile.test.process;


import java.util.List;

import java.util.Map;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.apache.ibatis.session.SqlSession;


import com.mobile.log.Log;

import com.mobile.log.LogFactory;

import com.mobile.orm.GlobalSqlClientAssists;

import com.mobile.orm.SqlClientAssists;

import com.mobile.web.DataView;

import com.mobile.web.servlet.util.RequestData;

import com.mobile.mybatis.SqlMapClient;


public class MyBatisTestProcessor {

Log logger = LogFactory.getLog(MyBatisTestProcessor.class);

SqlSession session;

public MyBatisTestProcessor()

{

session = SqlMapClient.getSqlSession();

}

public DataView teamList(HttpServletRequest request, HttpServletResponse response,

DataView dataView, SqlClientAssists sqlClientAssists, GlobalSqlClientAssists globalSqlClientAssists,

RequestData reqData) throws Exception 

{

try{

       List<Map> list = session.selectList("Test.getTeam");

         

       for(Map map : list)

       {

        logger.info("###### " + map.get("CODE") + " ######");

        logger.info("###### " + map.get("NAME") + " ######");

       }

}finally{

session.close();

}

return dataView;

}

}


: "Test" means the namespace and "getTeam" means an id for the mapped statement, defining in the above sampleSql.xml.

We should specify the fully qualified name of "Test.getTeam".




+ Recent posts

출처: http://large.tistory.com/23 [Large]