주식회사 누리아이티

정보자산의 보안강화를 위한 3단계 인증 보안SW(BaroPAM) 전문기업인 누리아이티

▶ BaroSolution/가이드

기억할 필요 없는 비밀번호를 위한 BaroPAM 솔루션의 API 가이드(IIS-C#)

누리아이티 2018. 8. 27. 10:22

목차
 
1. BaroPAM 연동 API
1.1 연동 API 구성
1.2 연동 API 함수
1.3 인증키 검증 부분
1.4 참고 사항(IIS 환경)

 

2. BaroPAM 적용
2.1 BaroPAM 적용 프로세스
2.2 BaroPAM 적용 화면
2.3 본인인증 적용 프로세스
2.4 본인인증 적용 화면

2.5 BaroPAM 앱 설치 및 정보 설정

 

3. NTP(Network Time Protocol) 설정
3.1 Windows 환경
 
4. About BaroPAM

 

 

 

1. BaroPAM 연동 API

정보자산에 로그인 시 Verification code에 입력할 일회용 인증키의 생성기인 BaroPAM 의 다운로드(https://play.google.com/store/apps/details?id=com.baro.pam)는 구글의 "Play 스토어" Apple "App 스토어"에서 가능하며, 설치는 일반 앱의 설치와 동일하다.

 

1.1 연동 API 구성

BaroPAM 관련 Dynamic linking library일회용 인증키를 검증하는데 사용된다.

 

API구분 설명 비고
barokey.h
libbarokey.dll
BaroPAM 관련 C#을 위한 Unmanaged C++ dll 버전임.
(.NET Framework 4.0 기반으로 컴파일 함)
 
barokey_clr.h
barokey_clr.dll
BaroPAM 관련 clr 버전으로 C#을 위한 managed C++ dll 버전임.
(.NET Framework 4.0 기반으로 컴파일 함)
 
libcrypto-1_1-x64.dll
libssl-1_1-x64.dll
Open SSL 관련 dll  

 

참고) BaroPAM 관련 dll을 사용하기 위해서는 반드시 "C:\Windows\System32" 디렉토리에 위치해야 한다.

 

 

일회용 인증키BaroPAM에 대한 header 파일인 다음과 같다.

 

barokey.h)

 

#ifndef _BAROKEY_API_H_
#define _BAROKEY_API_H_
 
#ifdef BAROPAMCORE_EXPORTS
#define BAROPAMCORE_API __declspec(dllexport)
#else
#define BAROPAMCORE_API __declspec(dllimport)
#endif
 
#ifdef __cplusplus
extern "C" {
#endif
 
BAROPAMCORE_API BOOL BARO_ENCRYPT(const char* data, char* enc_result, unsigned long buf_len);
BAROPAMCORE_API BOOL BARO_DECRYPT(const char* data, char* dec_result, unsigned long buf_len);
BAROPAMCORE_API BOOL BARO_GENERATEKEY(const char* login_id, const char* phone_no, const char* cycle_time, char* ota_key, unsigned long buf_len);
BAROPAMCORE_API BOOL BARO_VERIFYKEY(const char* login_id, const char* phone_no, const char* cycle_time, char* ota_key);
 
BAROPAMCORE_API char* BARO_ENCRYPTA(const char* data);
BAROPAMCORE_API char* BARO_DECRYPTA(const char* data);
BAROPAMCORE_API char* BARO_GENERATEKEYA(const char* login_id, const char* phone_no, const char* cycle_time);
BAROPAMCORE_API bool BARO_VERIFYKEYA(const char* login_id, const char* phone_no, const char* cycle_time, char* ota_key);
 
BAROPAMCORE_API wchar_t* BARO_ENCRYPTSW(const wchar_t* data);
BAROPAMCORE_API wchar_t* BARO_DECRYPTSW(const wchar_t* data);
BAROPAMCORE_API wchar_t* BARO_GENERATEKEYW(const wchar_t* login_id, const wchar_t* phone_no, const wchar_t* cycle_time);
BAROPAMCORE_API bool BARO_VERIFYKEYW(const wchar_t* login_id, const wchar_t* phone_no, const wchar_t* cycle_time, wchar_t* totp);
 
#ifdef __cplusplus
}
#endif
 
#endif //_BAROKEY_API_H_

 

Barokey_clr.h)

 

#pragma once
 
using namespace System;
 
namespace BaroPAM {
         public ref class BaroKeyCLR
         {
                  // TODO: Add your methods for this class here.
                  // in libbarokey.lib
                  /*
                  BAROPAMCORE_API wchar_t* BARO_ENCRYPTSW(const wchar_t* data);
                  BAROPAMCORE_API wchar_t* BARO_DECRYPTSW(const wchar_t* data);
                  BAROPAMCORE_API wchar_t* BARO_GENERATEKEYW(const wchar_t* login_id, const wchar_t* phone_no, const wchar_t* cycle_time);
                  BAROPAMCORE_API bool BARO_VERIFYKEYW(const wchar_t* login_id, const wchar_t* phone_no, const wchar_t* cycle_time, wchar_t* totp);
                  */
    protected:
        //BaroPAMCore* m_baropam = nullptr;
    public:
        // TODO: Add your methods for this class here.
        BaroKeyCLR(void);
        ~BaroKeyCLR(void);
 
        String^ BARO_ENCRYPTW(String^ data);
        String^ BARO_DECRYPTW(String^ data);
        String^ BARO_GENERATEKEYW(String^ login_id, String^ phone_no, String^ cycle_time);
        bool BARO_VERIFYKEYW(String^ login_id, String^ phone_no, String^ cycle_time, String^ ota_key);
 
        String^ BARO_ENCRYPTA(String^ data);
        String^ BARO_DECRYPTA(String^ data);
        String^ BARO_GENERATEKEYA(String^ login_id, String^ phone_no, String^ cycle_time);
        bool BARO_VERIFYKEYA(String^ login_id, String^ phone_no, String^ cycle_time, String^ ota_key);
         };
}

 

 

1.2 연동 API 함수

1) BARO_VERIFYKEYA 함수(Unmanaged C++ dll을 사용하는 경우)

 

- NAME

  BARO_VERIFYKEYA

 

- SYNOPSIS

  BOOL BARO_VERIFYKEY(const char* login_id, const char* phone_no, const char* cycle_time, char* ota_key)

 

- DESCRIPTION

  입력한 일회용 인증키가 맞는지 검증하는 함수.

 

login_id: 로그인-ID 항목에 입력한 ID를 설정.

phone_no: 사용자별 스마트 폰 번호를 숫자만 설정.

cycle_time: 사용자별로 지정한 일회용 인증키의 생성 주기(3~60)를 설정.

ota_key: BaroPAM 앱에서 생성하여 입력한 일회용 인증키를 설정.

 

만약, 사용자별로 스마트 폰 번호 및 개인별로 지정한 일회용 인증키의 생성 주기가 일회용 인증키의 생성기와 다른 경우 일회용 인증키가 달라서 검증에 실패할 수 있다. 반드시 정보를 일치시켜야 한다.

 

- RETURN VALUES

 성공 시에는 true을 반환하며, 실패 시는 false을 반환.

 

2) BARO_VERIFYKEYA 함수(Single byte를 지원하는 clr 버전인 경우)

 

- NAME

  BARO_VERIFYKEYA

 

- SYNOPSIS

  bool BARO_VERIFYKEYA(String^ login_id, String^ phone_no, String^ cycle_time, String^ ota_key)

 

- DESCRIPTION

  입력한 일회용 인증키가 맞는지 검증하는 함수.

 

login_id: 로그인-ID 항목에 입력한 ID를 설정.

phone_no: 사용자별 스마트 폰 번호를 숫자만 설정.

cycle_time: 사용자별로 지정한 일회용 인증키의 생성 주기(3~60)를 설정.

ota_key: BaroPAM 앱에서 생성하여 입력한 일회용 인증키를 설정.

 

만약, 사용자별로 스마트 폰 번호 및 개인별로 지정한 일회용 인증키의 생성 주기가 일회용 인증키의 생성기와 다른 경우 일회용 인증키가 달라서 검증에 실패할 수 있다. 반드시 정보를 일치시켜야 한다.

 

- RETURN VALUES

 성공 시에는 true을 반환하며, 실패 시는 false을 반환.

 

 

3) BARO_VERIFYKEYW 함수(Unicode를 지원하는 clr 버전인 경우)

 

- NAME

  BARO_VERIFYKEYW

 

- SYNOPSIS

  bool BARO_VERIFYKEYW(String^ login_id, String^ phone_no, String^ cycle_time, String^ ota_key)

 

- DESCRIPTION

  입력한 일회용 인증키가 맞는지 검증하는 함수.

 

login_id: 로그인-ID 항목에 입력한 ID를 설정.

phone_no: 사용자별 스마트 폰 번호를 숫자만 설정.

cycle_time: 사용자별로 지정한 일회용 인증키의 생성 주기(3~60)를 설정.

ota_key: BaroPAM 앱에서 생성하여 입력한 일회용 인증키를 설정.

 

만약, 사용자별로 스마트 폰 번호 및 개인별로 지정한 일회용 인증키의 생성 주기가 일회용 인증키의 생성기와 다른 경우 일회용 인증키가 달라서 검증에 실패할 수 있다. 반드시 정보를 일치시켜야 한다.

 

- RETURN VALUES

 성공 시에는 true을 반환하며, 실패 시는 false을 반환.

 

 

1.3 인증키 검증 부분

Visual Studio 환경 설정시 "Configuration Manager"에서 "Platform" "x64" 또는 "x86"를 설정해야 한다. 만약, 없는 경우 "new"를 클릭해서 등록하면 된다.

 

 

C# .NET Framework 프로젝트를 생성 후 Solution Explorer의 해당 프로젝트에서 "Add References…"를 클릭한다.

 

 

 

C# .NET Framework 프로젝트를 생성 후 Solution Explorer의 해당 프로젝트에서 References "barokey_clr.dll"을 등록한다.

 

 

) BARO_VERIFYKEYA 함수(Unmanaged C++ dll을 사용하는 경우)

 

C #에서 const char * C 함수에 전달하는 방법은 다음과 같다.

 

const char* .NET string이다. 관리되는 측면에서는 읽기 전용 매개 변수의 개념을 이해하지 못한다.

 

이것을 P/Invoke 컨텍스트에서 사용하는 경우 MarshalAs 특성을 선언하고, 이를 LPStr로 마샬링 해야 한다.

 

결과적인 서명은 다음과 같다.

[DllImport("SomeModule.dll")]
public static extern void set_param([MarshalAs(UnmanagedType.LPStr)]string lpString);

 

using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient; //this namespace is for sqlclient server 
using System.Configuration; // this namespace is add I am adding connection name in web config file config connection name
using System.Runtime.InteropServices; //DLL support
 
namespace WebApplication1 {
    public partial class _Default : Page {
[DllImport("libbarokey.dll", CallingConvention = CallingConvention.Cdecl)]
        extern public static bool BARO_VERIFYKEYA(
                                            [MarshalAs(UnmanagedType.LPStr)] String login_id
                                           ,[MarshalAs(UnmanagedType.LPStr)] String phone_no
                                           ,[MarshalAs(UnmanagedType.LPStr)] String cycle_time
                                           ,[MarshalAs(UnmanagedType.LPStr)] String ota_key
                                           );
 
        protected void Page_Load(object sender, EventArgs e) {
 
        }
 
        protected void btnCert_Click(object sender, EventArgs e) {
            try {
                String strLogin_id   = txtLogin_id.Text;
                String strKey        = txota_key.Text;
 
                bool    chkKey        = false;
 
                String  strPhone_no   = "01027714076";
                String  strCycle_time = "30";
 
                chkKey = BARO_VERIFYKEYA(
                             strLogin_id,
                             strPhone_no,
                             strCycle_time,
                             strKey
                         );
                if (chkKey == true) {
                    lblMessage.Text = "일회용 인증키 검증 성공......!!";
                } else {
                    lblMessage.Text = "일회용 인증키 검증 실패......!!";
                }
            } catch (Exception ex) {
                Response.Write(ex.Message);
            }
        }
    }
}

 

) BARO_VERIFYKEYA / BARO_VERIFYKEYW 함수(clr 버전을 사용하는 경우)

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace BaroKeyCLR_Test {
    public partial class Form1 : Form {
        //BaroKEY(C++/CLI)용 객체를 선언.
        BaroPAM.BaroKeyCLR barokey = new BaroPAM.BaroKeyCLR();
 
        public Form1() {
            InitializeComponent();
 
            inLoginID.Text = "User";
            inPhoneNo.Text = "01042483224";
        }
 
        private void btnVerify_Click(object sender, EventArgs e) {
            try {
                String strLogin_id   = inLoginID.Text;
                String strPhone_no   = inPhoneNo.Text;
                String strCycle_time = "30";
                String strOta_key    = outOtaKey.Text;
 
                //BaroKEY(C++/CLI)용 객체에서 해당 API를 사용.(Single Byte)
                bool bRet = barokey.BARO_VERIFYKEYA(strLogin_id, strPhone_no, strCycle_time, strOta_key);
 
                if (!bRet) {
                    MessageBox.Show(string.Format(">>\n{0}\n{1}\n{2}\n{3}\n--ID or PASSWORD doesn't match. \nRetry please."
                        , strLogin_id, strPhone_no, strCycle_time, strOta_key));
                } else {
                    MessageBox.Show("OK");
                }
 
            } catch (Exception ex) {
                MessageBox.Show("DLL Load error : " + ex.Message);
            }
        }
 
        //UNICODE
        private void button1_Click(object sender, EventArgs e) {
            try {
                String strLogin_id   = inLoginID.Text;
                String strPhone_no   = inPhoneNo.Text;
                String strCycle_time = "30";
                String strOta_key    = outOtaKey.Text;
               
                //BaroKEY(C++/CLI)용 객체에서 해당 API를 사용한다.(UNICODE )
                bool bRet = barokey.BARO_VERIFYKEYW(strLogin_id, strPhone_no, strCycle_time, strOta_key);
 
                if (!bRet) {
                    MessageBox.Show(string.Format(">>\n{0}\n{1}\n{2}\n{3}\n--ID or PASSWORD doesn't match. \nRetry please."
                        , strLogin_id, strPhone_no, strCycle_time, strOta_key));
                } else {
                    MessageBox.Show("OK");
                }
            } catch (Exception ex) {
                MessageBox.Show("DLL Load error : " + ex.Message);
            }
        }
    }
}

  

 

) verifyKEY 함수(Java 라이브러리 모듈인 barokey.jar를 사용하는 경우)

 

작업순서)

 

1) ikvmbin-7.2.4630.5.zip 다운로드

 

ikvm Java 모듈(jar) C#에서 사용할 수 있도록 dll로 변환해주는 툴임.

 

다운로드: https://osdn.net/projects/sfnet_ikvm/downloads/ikvm/7.2.4630.5/ikvmbin-7.2.4630.5.zip/

 

2) ikvmbin-7.2.4630.5.zip 압축 풀음

 

ikvmbin-7.2.4630.5.zip C:\Program Files (x86)\ 디렉토리에 압축을 풀음.

 

3) 환경변수(PATH) 설정

 

 

4) barokey.java 컴파일(java version "1.7.0_79"에서 컴파일 함)

 

C:\work\etc> javac barokey.java

 

5) barokey.jar 파일 생성

 

C:\work\etc> jar cf barokey.jar barokey.class

 

6) barokey.jar 파일을 ikvm을 통해서 barokey.dll 파일로 변환

 

C:\work\etc> ikvm barokey.jar

 

7) barokey.dll 파일을 C# 프로젝트의 참조에 추가

 

C# .NET Framework 프로젝트를 생성 후 Solution Explorer의 해당 프로젝트에서 References "barokey.dll"을 등록한다.

 

 

8) C# 프로그램에서 verifyKEY() 메소드 호출

 


public bool getOTACheck(String login_id, String phone_no, String cycle_time, String ota_key) {
    bool retVal = false;
    try {
         retVal = barokey.verifyKEY(login_id, phone_no, cycle_time, ota_key);
    } catch (Exception ex) {
        throw new Exception(throwEx(ex));
    }
    return retVal;
}

 

 

1.4 참고 사항(IIS 환경)

64비트 버전의 Microsoft Windows에서 32비트 버전의 Microsoft ASP.NET 1.1 32비트 버전 및 64비트 버전의 ASP.NET 2.0 간을 전환하는 방법을 설명한다.

 

두 버전의 ASP.NET을 모두 설치한 경우 Microsoft IIS(인터넷 정보 서비스) 6.0에서 실행되도록 각 ASP.NET 환경을 설정하기 위한 단계를 수행하지 않으면 오류 메시지가 나타날 수 있다. 예를 들어, ASP.NET이 제대로 설정되어 있지 않으면 웹 페이지에서 다음과 같은 오류 메시지가 나타날 수 있다.

서비스 사용할 수 없음

 

다음과 유사한 오류 메시지가 응용 프로그램 로그에 기록될 수 있습니다.

 

IIS 6.0에서는 32비트 모드와 64비트 모드를 모두 지원하지만 64비트 버전의 Windows에서 두 모드를 동시에 실행하는 것을 지원하지는 않는다. ASP.NET 1.1 32비트 모드에서만 실행되고, ASP.NET 2.0 32비트 모드와 64비트 모드에서 실행된다. 따라서 ASP.NET 1.1 ASP.NET 2.0을 동시에 실행하려면 32비트 모드에서 IIS를 실행해야 한다.

 

1. ASP.NET 1.1, 32비트 버전

 

32비트 버전의 ASP.NET 1.1을 실행하려면 다음과 같다.

 

시작, 실행을 차례로 클릭하고 cmd를 입력한 다음 확인을 클릭한다.

 

② 다음 명령을 입력하여 32비트 모드를 사용하도록 설정한다.

cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1

 

③ 다음 명령을 입력하여 ASP.NET 1.1 버전을 설치하고 IIS 루트 및 다음 아래에 스크립트 맵을 설치한다.

%SYSTEMROOT%\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe –i

 

④ 인터넷 정보 서비스 관리자의 웹 서비스 확장 목록에서 ASP.NET 버전 1.1.4322의 상태가 허용됨으로 설정되어 있는지 확인한다.

 

2. ASP.NET 2.0, 32비트 버전

 

32비트 버전의 ASP.NET 2.0을 실행하려면 다음과 같다.

 

시작, 실행을 차례로 클릭하고 cmd를 입력한 다음 확인을 클릭한다.

 

② 다음 명령을 입력하여 32비트 모드를 사용하도록 설정한다.

 

cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1

 

③ 다음 명령을 입력하여 ASP.NET 2.0(32비트) 버전을 설치하고 IIS 루트 및 다음 아래에 스크립트 맵을 설치한다.

 

%SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i

 

④ 인터넷 정보 서비스 관리자의 웹 서비스 확장 목록에서 ASP.NET 버전 2.0.50727(32비트)의 상태가 허용됨으로 설정되어 있는지 확인한다.

 

3. ASP.NET 2.0, 64비트 버전

 

64비트 버전의 ASP.NET 2.0을 실행하려면 다음과 같다.

 

시작, 실행을 차례로 클릭하고 cmd를 입력한 다음 확인을 클릭한다.

 

② 다음 명령을 입력하여 32비트 모드를 사용하지 않토록 설정한다.

cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 0

 

③ 다음 명령을 입력하여 ASP.NET 2.0 버전을 설치하고 IIS 루트 및 다음 아래에 스크립트 맵을 설치한다.

%SYSTEMROOT%\Microsoft.NET\Framework64\v2.0.50727\aspnet_regiis.exe -i

 

④ 인터넷 정보 서비스 관리자의 웹 서비스 확장 목록에서 ASP.NET 버전 2.0.50727의 상태가 허용됨으로 설정되어 있는지 확인한다.

 

참고 ASP.NET 2.0의 빌드 버전은 현재 릴리스된 빌드 버전에 따라 다를 수 있다. 위의 단계는 빌드 버전 2.0.50727에 해당한다.

 

2. BaroPAM 적용

 

2.1 BaroPAM 적용 프로세스

 

 

2.2 BaroPAM 적용 화면

 

 

2.3 본인확인 적용 프로세스

 

아이폰(iPhone)의 기기정보를 얻지 못해서 2차 인증키(일회용 인증키)를 생성하기 위해서 로그인 정보 항목을 선택 했을 때 "일회용 인증키" 생성 화면으로 이동하지 않은 경우가 발생할 수 있다.

 

또한, 타인의 폰번호를 부정으로 사용하지 못하도록 하기 위해서 별도의 본인확인 기능을 적용할 필요가 있는데, "BaroPAM" 앱에서는 자체 알고리즘을 적용하여 자체적으로 본인확인 절차를 실행하고 있다.

 

 

 

2.4 본인확인 적용 화면

 

아이폰(iPhone)의 기기정보를 얻지 못해서 2차 인증키(일회용 인증키)를 생성하기 위해서 로그인 정보 항목을 선택 했을 때 "일회용 인증키" 생성 화면으로 이동하지 않은 경우가 발생할 수 있다.

 

또한, 타인의 폰번호를 부정으로 사용하지 못하도록 하기 위해서 별도의 본인확인 기능을 적용할 필요가 있는데, "BaroPAM" 앱에서는 자체 알고리즘을 적용하여 자체적으로 본인확인 절차를 실행하고 있다.

 

 

2.5 BaroPAM 앱 설치 및 정보 설정

 

정보자산에 로그인 시 Verification code에 입력할 일회용 인증키의 생성기인 BaroPAM 앱의 다운로드(https://play.google.com/store/apps/details?id=com.baro.pam)는 구글의 "Play 스토어" Apple "App 스토어"에서 가능하며, 설치는 일반 앱의 설치와 동일하다.

 

 

 

3. NTP(Network Time Protocol) 설정

최근에는 서버/네트워크 장비에 대한 시간 동기화(타임서버 시간 동기화)하는 방법으로 NTP(Network Time Protocol)을 이용하여 관리자 계정에서 시스템의 시각을 현재 시각으로 설정할 수 있다.

 

3.1 Windows 환경

1. NTP란?

 

Network Time Protocol(네트워크 시간 프로토콜)의 약자로 네트워크 환경으로 구성된 장비(서버, PC, 통신장비, 방화벽 장비 등)의 시스템 시간을 동기화 하기 위한 규약이다.

 

윈도우에는

모든 윈도우서버는 NTP 서버가 될 수 있다.

모든 서버의 방화벽에서 UDP 123 번이 열려있어야 한다.

- NTP 서버와의 시간차이가 많이 날 경우(기본값: 15 시간) 동기화 되지 않는다.

  실제 시간과 근접한 시간으로 변경 후 동기화 할 수 있도록 한다.

데이터 일치를 위하여 동기화(Sync)요청을 하더라도 즉시 반영되는 것이 아니라, 조금씩 맞춰 간다.

 

  (: Server#2 서버가 Server#1 서버 보다 시간이 빠를 경우, Server#1 번의 시간으로 Server#2의 시스템시간을 동기화 할 경우, 동일한 시간대의 데이터가 생성되므로, 데이터 정합성에 오류가 발생한다. 이에 시간 동기화는 즉시 반영되는 것이 아니라, 조금씩 그 차이를 줄여나가는 방식이다. -  12 참조)

 

2. 시스템 환경

 

NTP 시간을 제공해주는 서버를 "NTP 서버", NTP 서버로 시간 동기화를 요청하는 서버를 "Slave 서버"로 명명한다.

 

서버명 및 IP 주소

 

3. 내부 NTP 서버

 

1) 외부 NTP 서버와 시간 동기화

 

내부 NTP 서버 시스템 시간을 인터넷 표준시(:time.bora.net)으로 설정한다.

 

① 실행서버

 

Server#1(IP:10.10.10.1)

 

② 시나리오

 

내부 NTP 서버 역할로 운용할 서버의 시간 동기화 대상을 외부 NTP(:time.bora.net, time.kornet.net)으로 설정하고, 설정(레지스트리)값을 확인 후 동기화 작업을 수행한다.

 

③ 작업

 

첫번째, 외부 NTP 서버를 기준으로 시간동기화 설정을 한다.

 

시작 -> cmd -> w32tm /config /syncfromflags:manual /manualpeerlist:time.microsoft.com /update

 

 1: 예상결과 

C:\>w32tm /config /syncfromflags:manual /manualpeerlist:time.microsoft.com /update
명령이 성공적으로 완료되었습니다

 

두번째, Windows Time 서비스의 설정값(레지스트리) 확인

 

시작 -> cmd -> w32tm /dumpreg /subkey:Parameters

 

 2: 예상 결과 

C:\>w32tm /dumpreg /subkey:Parameters
값 이름        값 종류           값 데이터
-----------------------------------------------------------------------------
ServiceMain    REG_SZ            SvchostEntry_W32Time
ServiceDll     REG_EXPAND_SZ    C:\WINDOWS\system32\w32time.dll
NtpServer      REG_SZ            time.bora.net,0x9 <- 외부 NTP 서버주소
Type            REG_SZ            NTP                   <- 외부 NTP 서버 사용

 

세번째, Windows Time 서비스 재시작

 

시작 -> cmd -> net stop w32tm

              -> net start w32tm

 

 3: 예상결과 

C:\>net stop w32time
Windows Time 서비스를 멈춥니다.
Windows Time 서비스를 잘 멈추었습니다.
 
C:\>net start w32time
Windows Time 서비스를 시작합니다.
Windows Time 서비스가 잘 시작되었습니다.

 

네번째, 시간 동기화

 

시작 -> cmd -> w32tm /resync

 

 4: 예상결과 

[정상]
C:\>w32tm /resync
로컬 컴퓨터에 다시 동기화 명령을 보내는 중
명령이 성공적으로 완료되었습니다.
 
[오류] : 방화벽에서 외부 UDP 123 포트가 막혀 있을 경우 발생할 수 있다.
C:\>w32tm /resync
동기화 명령 전송 - local computer...
사용 가능한 시간 데이터가 없어 컴퓨터가 동기화하지 못했습니다.

 

2) NTP 서비스 제공을 위한 구성 확인

 

내부 NTP 서버가 외부 NTP 서버를 참조하는지 확인한다.

 

① 실행서버

 

Server#1(IP:10.10.10.1)

 

 시나리오

 

내부 NTP 서버 역할로 운용할 서버의 서비스를 확인하여 Slave 서버에서 연결 할 수 있도록 구성 값을 확인한다.

 

 작업

 

첫번째, Windows Time 서비스 구동 확인

 

시작 -> cmd -> sc query w32time

 

 5: 예상 결과 

C:\>sc query w32time
       SERVICE_NAME      : w32time
       TYPE              : 20 WIN32_SHARE_PROCESS
       STATE             : 4 RUNNING
                             (STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)
       WIN32_EXIT_CODE   : 0 (0x0)
       SERVICE_EXIT_CODE : 0 (0x0)
       CHECKPOINT        : 0x0
       WAIT_HINT         : 0x0

 

두번째, NTP 서비스 구동 확인

 

시작 -> cmd -> netstat -ano | findstr 123

 

 6: 예상 결과 

C:\>netstat -ano | findstr 123
 UDP    0.0.0.0:123      *:*    1128
 UDP    0.0.0.0:62123    *:*    1428
 UDP    [::]:123         *:*    1128

 

4. Slave 서버

 

1) Slave 서버 환경 구성

 

내부 NTP 서버(IP:10.10.10.1)를 기준으로 Slave 서버의 시스템 시간을 설정한다. 시간 차이가 너무 많을 경우 동기화가 되지 않으니, 수동으로 근접한 시간을 맞추고 동기화 할 수 있도록 한다.

 

① 실행서버

 

Server#2(IP:10.10.10.2)

Server#3(IP:10.10.10.3)

 

(각 서버별로 수행)

 

 시나리오

 

시간 동기화 대상을 내부 NTP 서버(IP:10.10.10.1)로 설정하고, 동기화 작업을 수행한다.

 

 작업

 

첫번째, 내부 NTP 서버(IP:10.10.10.1)를 기준으로 시간동기화 설정을 한다.

 

시작 -> cmd -> w32tm /config /syncfromflags:manual /manualpeerlist:10.10.10.1 /update

 

 7: 예상결과 

C:\>w32tm /config /syncfromflags:manual /manualpeerlist:10.10.10.1 /update
명령이 성공적으로 완료되었습니다.

 

두번째, Windows Time 서비스의 설정값(레지스트리) 확인

 

시작 -> cmd -> w32tm /dumpreg /subkey:Parameters

 

 8: 예상 결과 

C:\>w32tm /dumpreg /subkey:Parameters
값 이름        값 종류           값 데이터
-----------------------------------------------------------------------------
ServiceMain    REG_SZ           SvchostEntry_W32Time
ServiceDll     REG_EXPAND_SZ    C:\WINDOWS\system32\w32time.dll
NtpServer      REG_SZ           10.10.10.1 <- 외부 NTP 서버주소
Type            REG_SZ           NTP        <- 외부 NTP 서버 사용

 

세번째, Windows Time 서비스 재시작

 

시작 -> cmd -> net stop w32tm

              -> net start w32tm

 

 9: 예상결과 

C:\>net stop w32time
Windows Time 서비스를 멈춥니다.
Windows Time 서비스를 잘 멈추었습니다.
 
C:\>net start w32time
Windows Time 서비스를 시작합니다.
Windows Time 서비스가 잘 시작되었습니다.

 

세번째, 시간 동기화

 

시작 -> cmd -> w32tm /resync

 

 10: 예상결과 

C:\>w32tm /resync
로컬 컴퓨터에 다시 동기화 명령을 보내는 중
명령이 성공적으로 완료되었습니다.

 

2) NTP 서버와 시간차 확인

 

특정 서버(ex.NTP 서버)와 실행한 서버와의 시간차이를 확인한다.

 

① 실행서버

 

Server#2(IP:10.10.10.2)

Server#3(IP:10.10.10.3)

 

(각 서버별로 수행하여 확인 할 수 있다.)

 

 시나리오

 

특정서버(Master Server:10.10.10.1) Slave Server(10.10.10.2)시간 동기화 대상을 Master Server 설정하고, 동기화 작업을 수행한다.

 

 작업

 

첫번째, Master Server 를 기준으로 시간동기화 설정을 한다.

 

시작 -> cmd -> w32tm /stripchart /dataonly /computer:10.10.10.1

 

  비교대상 서버와 시간이 일치한다면, 하기와 유사한 결과값을 볼 수 있다.

 

 11: 예상결과 

C:\> w32tm /stripchart /dataonly /computer:10.10.10.1
Tracking 10.10.10.1 [10.10.10.1].
The current time is 2012-04-18 오후 19:17:13 (local time).
19:17:13, +00.2676328s     -> 비교 대상 서버와 +00.2676328 초만큼 차이가 난다.
19:17:15, +00.2593851s
19:17:17, +00.2589499s
19:17:19, +00.2428931s
^C                         -> 중지하기 위해서는 “Ctrl + c”를 누르면 된다.
      +00.xxxxxxx(또는 -00.xxxxxxx)로 대상 NTP 서버와 차이나는 시간만큼 표기된다.
      ) +120.2428931s -> +120 초 차이가 남

 

5. NTP 설정 후 동기화 요청 및 동기화 확인

 

 12: Slave 서버 동기화 설정 

NTP 서버(IP:10.10.10.1) 서버를 시스템 시간으로 설정한다.
C:\>w32tm /config /syncfromflags:manual /manualpeerlist:10.10.10.1/update
명령이 성공적으로 완료되었습니다.
 
Windows Time 서비스를 재기동한다.
C:\>net stop w32time
Windows Time 서비스를 멈춥니다..
Windows Time 서비스를 잘 멈추었습니다.
 
C:\>net start w32time
Windows Time 서비스를 시작합니다..
Windows Time 서비스가 잘 시작되었습니다.
 
NTP 서버(IP:10.10.10.1)로 지정한 서버와 동기화를 요청한다.
C:\>w32tm /resync
로컬 컴퓨터에 다시 동기화 명령을 보내는 중
명령이 성공적으로 완료되었습니다.
 
NTP 서버(IP:10.10.10.1)와 실행 중인 서버와의 시간차이를 확인한다.
C:\>w32tm /stripchart /dataonly /computer:10.10.10.1
10.10.10.1[10.10.10.1:123] 추적 중
현재 시간은 2012-04-19 오후 22:47:25 입니다.
22:47:25, +23.2364090s
22:47:27, +22.7004942s    -> 조금씩이지만 차이가 줄어드는 것을 볼 수 있다.
22:47:30, +22.1639462s
22:47:32, +21.6430236s
^C                        -> 중지하기 위해서는 “Ctrl + c”를 누르면 된다.

 

6. 주기적인 시간 동기화

 

주기적으로 시간을 자동으로 동기화 하게 만드는데, 방법은 다음과 같다.

 

1) 시작 – 실행 – regedit (혹은 Winkey+R  regedit)

 

2) HKEY_LOCAL_MACHINE\

   SYSTEM\

   CurrentControlSet\

   services\

   W32Time\

   TimeProviders\

   NtpClient

 

3) SpecialPollInterval 이름을 더블 클릭

 

4) 10진수로 바꿔서 본인이 원하는 숫자를 입력.

   60 = 60초, 600 = 10, 3600 = 1시간, 86400 = 1

   초로 계산한다.

 

5) 시작 – 실행 – cmd (혹은 Winkey+R  cmd)

 

6) Windows Time 서비스 재기동

   net stop w32time 엔터

   net start w32time 엔터

 

7) Windows Time 서비스 재부팅 시 자동 실행 
   sc config w32time start= auto
   sc triggerinfo w32time start/networkon stop/networkoff

 

7. 참고 사항

 

1) NTP Client 활성화 

reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient" /v Enabled /t REG_DWORD /d 1 /f

 

2) 동기화 요청주기 설정(60) 

reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient" /v SpecialPollInterval /t REG_DWORD /d 60 /f

 

3) 동기화 조건 설정 

reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Config" /v MaxPosPhaseCorrection /t REG_DWORD /d 0xFFFFFFFF /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Config" /v MaxNegPhaseCorrection /t REG_DWORD /d 0xFFFFFFFF /f

 

기본 값은 54000(15시간)인데, 현재 시간과 NTP 서버의 시간이 15시간 이상 차이가 나면 동기화 하지 않는다. 이 값을 0xFFFFFFFF로 변경하면 시간 차이에 상관없이 무조건 동기화 하겠다는 뜻이다.

 

4) NTP 서버 설정 

w32tm /config /syncfromflags:manual /manualpeerlist:"kr.pool.ntp.org"

 

NTP 서버는 기본적으로 "time.windows.com"을 우리나라 pool time server "kr.pool.ntp.org"로 지정함.

 

5) Windows Time 서비스가 자동으로 시작되도록 설정 

sc config w32time start=auto
sc triggerinfo w32time start/networkon stop/networkoff

 

Windows Time 서비스는 기본적으로 Domain에 가입된 상태에서만 자동으로 시작되게 트리거 설정되어 있다. 따라서 이 트리거를 네트워크 시작/중지로 변경해 주는 것이다. 이렇게 하지 않으면 Workgroup 환경에서는 "sc config w32time start=auto" 해두어도 실제로는 리부팅 후 자동으로 서비스가 올라오지 않는다. 따라서 반드시 필요한 설정이라 할 수 있다.

 

6) Windows Time 서비스 재시작 

net stop w32time
net start w32time

 

7) NTP 동기화 즉시 실행 

w32tm /resync /nowait

 

8) 현재 NTP 동기화 상태를 확인 

w32tm /query /status

 

reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient" /v Enabled /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient" /v SpecialPollInterval /t REG_DWORD /d 60 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Config" /v MaxPosPhaseCorrection /t REG_DWORD /d 0xFFFFFFFF /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Config" /v MaxNegPhaseCorrection /t REG_DWORD /d 0xFFFFFFFF /f
w32tm /config /syncfromflags:manual /manualpeerlist:"kr.pool.ntp.org"
sc config w32time start=auto
sc triggerinfo w32time start/networkon stop/networkoff
net stop w32time
net start w32time
w32tm /resync /nowait
w32tm /query /status

 

9) Windows 현재 날짜 및 시간 확인 및 자동 설정

 

 

Windows 우측 하단의 날짜와 시간에 커서를 대고 "마우스 오른쪽 버튼"을 클릭하면 다음과 같은 팝업 화면이 나타난다.

 

 

위의 팝업 화면의 메뉴에서 "날짜/시간 조정(A)"을 클릭하면 다음과 같은 "날짜 및 시간"을 설정하는 화면이 나타난다.

 

 

위 화면의 항목 중 "자동으로 시간 설정" "자동으로 표준 시간대 설정" 항목을 "On"해야 한다.

 

 

4. About BaroPAM

 

Version 1.0 - Official Release - 2016.12.1

Copyright ⓒ Nurit corp. All rights reserved.

http://www.nurit.co.kr

 

제 조 사 : 주식회사 누리아이티
등록번호 : 258-87-00901
대표이사 : 이종일
대표전화 : 02-2665-0119(영업문의/기술지원)
이 메 일 : mc529@nurit.co.kr
주    소 : 서울시 강서구 마곡중앙2로 15, 913호(마곡동, 마곡테크노타워2)