everydayminder

learn something everyday

Jira에 MySQL 연동하기

leave a comment »

어떤 방법을 선택했건, Jira를 띄울 수 있는 상태가 되었다면,
이제 MySQL을 연결해서 사용할 수 있도록 설정을 진행해보자.

1. MySQL 계정 설정
atlassian가이드에는 다음과 같이 안내되어 있다.

CREATE DATABASE jiradb CHARACTER SET utf8 COLLATE utf8_bin;
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,INDEX on <JIRADB>.* TO '<USERNAME>'@'<JIRA_SERVER_HOSTNAME>' IDENTIFIED BY '<PASSWORD>';
flush privileges;

DB 접속에 사용할 계정 정보로 빈 칸을 채워넣고 실행하자.
정상적으로 grant가 되었는지는,

show grants;

를 수행하여 확인할 수 있다.

2. MySQL Connector 설치
첫 시도 시, MySQL Connector를 yum을 사용하여 다운로드하고 진행했으나,
DB 연결에서 실패하였다.

yum install mysql-connector-java

atlassian 가이드에 안내된 바와 같이, MySQL 공식 사이트로부터
(http://dev.mysql.com/downloads/connector/j) connector를 다운로드 하고 진행하니,
별 에러 없이 connection에 성공하였다.

MySQL 사이트로부터 다운로드한 파일로부터, mysql-connector-java.5.x.x-bin.jar를
찾아 jira를 설치한 곳의 lib 디렉토리에 복사한다.
(내 경우, /opt/atlassian-jira에 jira를 설치했고, /opt/atlassian-jira/lib에
해당 connector jar를 복사하였다.)

3. Jira 설정 진행
지난 포스팅에서와 같이 Jira를 설치하고, 실행시켰다면 브라우저 상에서
http://:8080으로 접속 가능할 것이다.

이제 DB 종류를 MySQL로,
접속할 주소와, 계정 정보 등을 본인이 설정한 대로 모두 입력하자.

하단의 접속 테스트를 실행하여 정상적으로 연결이 된다고 뜬다면,
다음 단계로 넘어가자.

4. 기타 설정
라이센스, 기타 정보 등을 모두 입력하고 나면,
다소 시간이 걸리지만, 설정이 모두 완료될 것이다. (내 경우는 꽤 오랜 시간이
걸려서 첫 화면이 떴다.)

5. Trouble shooting
Jira를 설치한 디렉토리의 /logs/catalina.out을 살펴보면 어떤 에러가 발생했는지
확인할 수 있을 것이다.

내 경우는,

ERROR
The Gadget Dashboard bundled plugin is not available. Please contact an administrator to ensure the Gadget Dashboard plugin is enabled!
 
Perhaps you need to log in to see the page.
If you think this message is wrong, please consult your administrators about getting the necessary permissions.

과 같은 에러가 발생하였고, atlassian 사이트에 나와 있는 안내를 참고하여,

$JIRA_HOME/plugins/.osgi-plugins를 삭제하고, Jira를 재시작 하였다.

그 이후, 다시 실행시켰더니 이번에는 몇몇 플러그인이 로딩되지 않았다고 에러 메시지가
떴다. 이 역시 atlassian 사이트로부터 bin/setenv.sh에 선언되어 있는 환경변수를 조정해 보라는
안내를 발견하여, 다음과 같이 옵션을 변경하였다.

JVM_SUPPORT_RECOMMENDED_ARGS=300

이후, Jira를 시작시켰더니 앞서 발생한 플러그인 로딩 실패와 관련한 에러는 발생하지 않고,
정상적으로 구동 되었다.

6. 정리
1) jira를 어떤 방법이든 택하여 설치
2) MySQL Connector 최신 버전 설치
3) Connector jar를 lib에 복사
4) setenv.sh내 환경변수(JVM_SUPPORT_RECOMMENDED_ARGS=300 편집, 메모리 값 조정)
5) atlassian 가이드 많이 찾아보기

Written by everydayminder

March 29, 2014 at 16:20

Posted in TIPs, tools

tar.gz로부터 Jira(you host)를 CentOS에 설치하기

leave a comment »

Jira를 installer (bin)로부터 설치하는 대신,tar.gz로부터 설치하더라도 사실 별 차이는 없다.

다음과 같이 진행하였다.

1. admin 권한을 가진 계정으로 진행 (예: jira)
2. jira (tar.gz)를 atlassian으로부터 다운로드한다.
3. 원하는 디렉토리에 해당 파일을 압축 해제한다.
예) /opt/atlassian-jira

압축을 해제하고 디렉토리 구조를 bin 파일을 설치한 것과 비교해 보면,
사실 동일하다. tomcat도 함께 패키징 되어 있다.

atlassian 사이트내 가이드에 따르면, 설치 방법이 installer를 사용하거나,
지금 방법과 같이 tar.gz로부터 설치하는 것을 권장한다고 한다.

war 파일을 통한 설정은 그다지 권하지 않는다고 한다.

4. jira의 데이터가 저장될 디렉토리를 생성하고, 환경변수에
JIRA_HOME으로 설정하자. 이 디렉토리도 jira 계정과 동일하게 owner 설정이 되어 있어야 한다.

5. jira를 설치한 디렉토리의 bin을 열어보면
start-jira.sh로 시작시키고, stop-jira.sh로 종료시키면 된다.

Written by everydayminder

March 29, 2014 at 15:53

Posted in tools

git 실행시 libcurl.dll에서 curl_multi_timeout 에러 발생시

leave a comment »

에러가 발생하는 원인/상황은 다양할텐데,

내 경우는 다음과 같이 조치하였다.

 

1. http://curl.haxx.se/libcurl/ 에 방문하여, libcurl.dll을 다운로드한다.

2. c:\Windows\System (32bits), c:\Windows\SystemWow64 (64bits)에

   위 단계에서 다운로드한 libcurl.dll을 복사한다.

  

  

Written by everydayminder

March 28, 2014 at 00:08

Posted in TIPs

Installer방식으로 Jira (you host)를 CentOS에 설치하기

leave a comment »

매우 유명한 issue tracker인 Jira를 어쨌든 한 번 써보고 싶었다.
atlassian에서 운영하는 버전으로 말고, 직접 내가 설치하는 버전으로 구매했다.

You host 버전을 구매하며, 10 users 미만이면 $10가 든다.
그 옆에 Jira Agile은 $20가 든다고 한다.

그래서, 이왕이면 스크럼도 되고 칸반도 된다고 써있는 Jira Agile로 간다!
조금 더 읽어보니, Jira Agile은 Jira의 plugin이고, 구 Greenhopper라고 써 있다.

각각 $10로 총 $20 들었다.

1. 설치 환경
  – OS : Centos6
  – JDK : OpenJDK7
  – MySQL

2. JDK7 설치

yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel

을 설치한다.

.bash_profile내, JDK의 path를 잡아주었다.

JAVA_HOME=/usr/lib/jvm/java-openjdk
PATH=$PATH:$JAVA_HOME/bin
export PATH

설치/설정 후, shell상에서 java -version, javac -version
을 수행하여 java가 잘 설치되었는지 확인한다.

3. DB 설치/설정
HSQLDB 대시 MySQL을 향후 설정할 것이므로,
MySQL을 설치하고, 기초 설정을 하자.

yum install mysql-server

를 수행하여 mysql 서버를 설치하자.

설치가 완료되면,

service mysqld start

를 실행시킨다.
친절하게 안내문이 나오는데,

/usr/bin/mysqladmin -u root password 'new-password'

를 수행하여, root에 새 비밀번호를 할당해 주라고 한다.

혹은 위의 방법 대신,

/usr/bin/mysql_secure_installation

을 실행하라고 안내문도 뜬다.

mysql_secure_installation을 실행시켜 보자.
이것저것 interactive하게 묻는다.

* Set root password? [Y/n]
* Remove anonymous users? [Y/n]
* Disallow root login remotely? [Y/n]
* Remove test database and access to it? [Y/n]
* Reload privilege tables now? [Y/n]

3. Jira 다운로드/설치
atlassian에서 jira를 다운로드한다. bin/ tar.gz/ war 형식
등이 있으니 원하는 것으로 다운로드 하면 된다. (그러나, 결국 어떤 형식으로 받아도 나중에 확인해보면 web application일 뿐이다.)

wget http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-6.2.1-x64.bin

로부터 jira를 임의의 디렉토리에 다운로드 한다. (어차피 세부 디렉토리 설정 등은 추후 인스톨 과정에서 설정할 것이다.)
만약, bin 파일이 아닌 다른 형식의 파일을 다운로드했다면, 직접 디렉토리도 생성하는 등의 관리를 해줘야 할 수도 있다.

admin 권한이 없는 계정으로부터 jira를 설치하려고 하면, 시스템 권한이 없다고 에러를 보게 될 것이다.
따라서, 계정에 시스템 권한을 주고 설치를 하거나, 나중에 후조치를 하면 될 것이다.

설치의 편의상 우선 root로 진행하였다.

chmod +x atlassian-jira-6.2.1-x64.bin
./atlassian-jira-6.2.1-x64.bin

다음의 메시지가 나오면서 설치가 진행된다.
내 경우는, Advanced Option으로 설치를 진행시켰고,
디렉토리는 각각 아래와 같이 명시했다.

Unpacking JRE ...
Starting Installer ...
Mar 22, 2014 6:29:55 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.

This will install JIRA 6.2.1 on your computer.
OK [o, Enter], Cancel [c]

Choose the appropriate installation or upgrade option.
Please choose one of the following:
Express Install (use default settings) [1], Custom Install (recommended for advanced users) [2, Enter], Upgrade an existing JIRA installation [3]
2

Where should JIRA 6.2.1 be installed?
[/opt/atlassian/jira]

Default location for JIRA data
[/var/atlassian/application-data/jira]
/var/atlassian/jira/data
Configure which ports JIRA will use.
JIRA requires two TCP ports that are not being used by any other
applications on this machine. The HTTP port is where you will access JIRA
through your browser. The Control port is used to Startup and Shutdown JIRA.
Use default ports (HTTP: 8080, Control: 8005) - Recommended [1, Enter], Set custom value for HTTP and Control ports [2]
8090
Use default ports (HTTP: 8080, Control: 8005) - Recommended [1, Enter], Set custom value for HTTP and Control ports [2]

JIRA can be run in the background.
You may choose to run JIRA as a service, which means it will start
automatically whenever the computer restarts.
Install JIRA as Service?
Yes [y, Enter], No [n]

4. 계정/권한 변경
jira 계정을 만들고 owner를 변경해 준다.

useradd jira
passwd jira

chown -R jira:jira /opt/atlassian
chown -R jira:jira /var/atlassian

5. 실행
jira를 설치한 곳의 bin 디렉토리에 가면, tomcat 관련 파일들이 보이고 익숙해 보이는 shell 들이 눈에 띈다.
startup.sh를 실행시키고 브라우저에서 접속 여부를 확인하자.

첫 실행시 다소 시간은 걸리겠지만, 잠시 후 다음과 같은 화면이 뜨면 일단 설치는 된 것이다.
이후 세부 설정을 하자. (다음 포스트)

welcome

Written by everydayminder

March 23, 2014 at 22:56

Posted in tools

Sonar + Jenkins 설정

leave a comment »

현재 Jenkins를 통해 CI(Continuouse Integration)를 하고 있고,
코드의 정적 분석을 FindBugs, PMD, CheckStyle을 써서 리포트를 보고 있긴 하지만,
Sonar를 접하고 설치/ 사용해보고자 한다.

Sonar는 http://www.sonarqube.org에서 세부 정보를 확인할 수 있다.
Installation Guide 링크를 따라 가보니, Confluence를 사용하여 위키를 꾸며놨다.

“Get Started in Two Minutes”의 설명에 따르면,
설치하고, 실행하는 방법은 무척이나 단순해 보인다.

1. SonarQube 배포판을 압축풀고, 실행시킨다.
2. SonarQube Runner 배포판을 압축풀고, 실행시킨다.
3. 샘플 프로젝트를 압축풀고, sonar-runner를 실행시켜서 분석시킨다.
4. 결과를 화면에서 확인한다. (http://localhost:9000)

여기까지 사실로부터 유추할 수 있는 사실은,
– SonarQube는 서버 프로그램이다.
– SonarQube는 클라이언트 프로그램이다. (소스 분석을 위해 실행시켜야 함)
– 별도의 웹서버/DB 설정이 필요없다.

정도이다.

Sonar에 대한 소개/분석 자료를 통해 좀더 알아보면,

Sonar가 지원하는 DBMS는

Apache Derby (내장)
mySQL
Oracle
PostgreSQL
MS-SQL Server

등이다.

설치에 앞서 JDK가 1.5+으로 설치되어 있어야 하며,
Runner(소스 분석을 위해 실행시키는 프로그램)로는
– SonarQube Runner
– Maven
– Ant
를 지원한다고 한다.

따라서, 앞서 언급한 Installation guide는 최소한의 설정으로 가장 빨리
한 번 실행시켜보기 위한 설정이라 할 수 있다.

0. 설치/테스트 환경
OS : Windows7 (64)
JDK : JDK1.6
DB : –

1. 설치
압축을 풀고 (c:\dev\sonarqube-4.0, 이하 $SONAR_HOME), $SONAR_HOME\bin\windows-x86-64\bin에
있는 SartSonar.bat를 실행시킨다.

wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
jvm 1 |
jvm 1 | 2013.12.18 11:02:42 INFO Web server is started

와 같은 메시지가 보이면서 시작되었다.
브라우저를 통해, localhost:9000으로 접속해봐도 화면이 휑하다.
Sonar의 기본 관리자 계정 정보는 admin:admin이니 접속해 보자.

2. 환경설정 확인
$SONAR_HOME\conf\sonar.properties 파일을 확인해 보자.
별도 DB 설정을 하지 않았기에, Apache Derby 내장 DBMS를 사용하도록 설정된 채이다.

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar

#—– Embedded database H2
# Note: it does not accept connections from remote hosts, so the
# SonarQube server and the maven plugin must be executed on the same host.

# Comment the following line to deactivate the default embedded database.
sonar.jdbc.url=jdbc:h2:tcp://localhost:9092/sonar

와 같은 문구가 보이고,
그 밑으로는 Sonar가 지원하는 여러 다른 종류의 DBMS의 configuration들이 주석처리 되어 있다.
해당 DBMS를 사용할 경우, 변경하여 사용하면 될 것 같다.

3. 프로젝트 분석은 어떻게?
Sonar는 분석 결과를 보여주는 웹 애플리케이션이고, 결국 분석은 다른 프로그램들이 도와줘야 한다.
http://docs.codehaus.org/display/SONAR/Analyzing+Source+Code
에 안내된 바에 따르면,

프로젝트 분석은 아래의 방법중 하나를 택하면 된다.
Analyzing with SonarQube Runner (recommended analyzer)
Analyzing with SonarQube Ant Task
Analyzing with Maven
Analyzing with Gradle
CI Engines

Sonar에 안내된 2분안에 시작하기 튜토리얼에서도 샘플 프로젝트 디렉토리로부터, SonarQube Runner를
실행시키는 것으로 프로젝트 등록/분석을 시도하였다.

결국, Runner 등과 같은 프로그램이 분석 결과를 DBMS에 기록을 하면, Sonar 웹은 그 데이터를 DB로부터 읽어서
보여줄 뿐일 것이다.

프로젝트 등록을 위한 UI도 존재하지 않는 것 같은데, 공식 도움말에서도 이런 문구를 발견할 수 있다.
Adding a project to SonarQube is not done through the web interface, but automatically when the project is analyzed for the first time.

어쨌든, 프로젝트를 등록하기 위해서는 일단 분석을 한 번 시도하면 된다는 이야기이다.

4. Jenkins + Sonar 설정
나는 Jenkins를 이미 사용하고 있으므로, Jenkins에 Sonar 설정을 하는 방법에 대해 살펴보고자 한다.
Jenkins에 Maven 관련 설정이 되어있다고 가정한다.

Jenkins 관리 > 플러그인관리 > Sonar 관련 플러그인들을 찾아 설치한다. (Jenkins Sonar Plugin, Sonargraph Plugin)
이후, Jenkins를 재시작하고, Jenkins의 global 설정으로부터 Sonar 환경설정을 하자.

Jenkins 관리 > 시스템설정 > Sonar (고급 메뉴) 관련 항목을 지정한다.
Apache Derby 사용 및 기본 설정으로 그대로 사용한다면, 아마 다음과 같이 입력하게 될 것이다.

Server URL : http://localhost:9000
Sonar account login : admin
Sonar acocun password : admin
Database URL : jdbc:h2:tcp://localhost:9092/sonar
Database login : sonar
Database password : sonar

Sonar Runner에 대한 설정은 별도로 수행하지 않았다.
프로젝트 설정의 Post-build Actions로부터 Sonar를 선택하고, jdk 설치 정보만 변경하고 저장하였다.
(다른 설정은 디폴트 사용)

이후, 빌드를 수행하면, 해당프로젝트의 대시보드에도 Sonar 아이콘이 생겨있고, 링크도 클릭가능하다.
해당 링크를 클릭하면, 결국 처음에 설정한 바와 같이 http://localhost:9000으로 리다이렉션 될 것이다.
그리고, 이전에 비어있던 화면에 무언가 정보가 채워져 있는 것을 발견할 수 있다.
당연히, Jenkins를 통하지 않고도, 브라우저에서 직접 http://localhost:9000을 접속하면 동일한 화면을 볼 수 있다.
(DB에 분석 데이터가 있으니까)

볼 수 있는 내용들은 다음과 같다.
Lines of code
Documentation
Duplications
Complexity
Issues
Package tangle index
Unit Tests Coverage

해당 항목들을 클릭하면, 상세 내용을 볼 수 있다.
이슈들을 클릭하면, 어떤 부분이 문제가 되고, 어떻게 해결하면 좋을지도 조언해 주기 때문에
코드의 퀄리티를 높이는데 큰 도움이 될 것 같다.

Jenkins에 이미 SCM 관련 설정을 해두어, 소스코드 변동에 따른 폴링/자동 빌드를 설정해 두었기 때문에
소스 변동시마다 Sonar도 분석을 자동으로 업데이트 하게 되었다.

5. Maven 단독
Maven으로 소스 분석을 하려면, maven 관련 설정을 변경해줘야 한다.
Sonar에 공식적으로 안내된, maven 설정은

<settings>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!– Example for MySQL–>
<sonar.jdbc.url>
jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8
</sonar.jdbc.url>
<sonar.jdbc.username>sonar</sonar.jdbc.username>
<sonar.jdbc.password>sonar</sonar.jdbc.password>

<!– Optional URL to server. Default value is http://localhost:9000 –>
<sonar.host.url>
http://myserver:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>

실행은,
mvn clean install -DskipTests=true
mvn sonar:sonar
와 같이 실행하면 된다.

그런데, 위의 설정만으로는 실제 사용시 번거로울 것 같다.

위의 설정에서 언급한 바와 같이, 분석을 어떻게 수행하느냐의 문제에 대해 생각해 보자.
Jenkins에 설정한 경우,
– Who : Jenkins
– How : Maven 또는 Runner
– When : 소스 변경이 되었을 때
로 생각할 수 있는데 비해,

Maven으로 단독 설정할 경우,
– Who : 사용자
– How : Maven
– When : 사용자가 명령어를 실행할 경우
가 되어 버린다. 결국, 소스를 사용자가 직접 최신 버전으로 업데이트 한 후, maven 명령어를 돌려야 의미가 있을 것이다.

즉, 소스 변경과 함께 자동으로 최신 소스를 검사할 수 있도록 설정하지 않고서는 별도의 maven 실행을 통한 소스 검사만으로는
활용도가 낮아진다.

6. 요약
– Jenkins와 같은 CI tool과 연계해서 Sonar 검사를 하도록 하거나
– 열심히 알아서 소스 갱신/ 검사 돌리자.

* SCM Activity라는 플러그인이 있는 것을 확인했으나, 주기적으로 폴링하여 소스를 가져오고 검사하는 용도가 아닌
SCM blame 정보를 출력해주기 위한 용도인 듯하다. (http://docs.codehaus.org/display/SONAR/SCM+Activity+Plugin)

*  소스 정적 검사 및 해결책 제시가 제법 괜찮다. 쓸만 한 것 같다.

Written by everydayminder

December 26, 2013 at 23:01

Posted in java, tools, Uncategorized

아이폰으로 집의 네트워크에 VPN으로 접속하려면?

leave a comment »

나중에 다시 할 수도 있는 재설치를 위해 기록으로 남겨둔다.

예전에 사용하던 IPTIME 공유기를 가지고 있었다면,
일단 우선적으로 공유기에서 제공하는 VPN 기능을 검토했을 것이다. (그랬으면 쉬웠을텐데..다시 살까?)

일단, 현재 집에서 사용하는 공유기는 Netgear 공유기이다.
이 모델에는 VPN 기능이 제공되지 않는다.

따라서, 검색/ 정보 수집을 통해 PPTPD, OpenVPN, OpenSwan 등을 조사했으며,
공유기 내부에서도 잘 동작한다고 알려진 OpenVPN을 설치하기로 하였다.

우선, OpenVPN에 대한 설치파일/세부 정보는 openvpn.net으로부터 확인할 수 있다.
최초 설치 시도는 CentOS VM상에 yum install을 통해 설치/실행하는 것을 진행하였으나,
OpenVPN-AS(Access Server)가 설치가 쉽다는 내용을 접하고, OpenVPN-AS로 급선회하였다.

OpenVPN Server와 달리, AS의 경우 설치 과정이 매우 간단했다.
해당 RPM 설치 후, 모든 설정을 관리자웹 상에서 설정해 주기만 하면 될 뿐만 아니라,
사이트내에 각 기능별 설명들이 기본적으로 표기가 되어 있어서 도움이 되었다.
(OpenVPN 서버의 경우, 기본 값들이 무슨 기능을 하는지 주석이 달려있기는 하지만,
다소 설명이 부족하다는 느낌을 받았다.)

1. 집 네트워크 구성

PC1 -+
         |
PC2 -+—-+ 공유기 +—-+ ISP 공유기 +—-+ 인터넷 +—-+ 아이폰
         |
PC3 -+

예전에 케이블 인터넷을 사용했을 경우, ISP 공유기 대신 케이블 모뎀이 위치했고,
내 공유기 설정에서 포트포워딩을 설정해주는 것만으로 집 내부 PC들에
접근이 가능했으나, 이사 후 ISP 제공 공유기가 앞단에 더 존재하게 되어 ISP 공유기
설정도 함께 변경해 줘야만 내부 접근이 가능하게 되었다. (DMZ로 설정하거나, 다른 룰을 추가하거나)

2. VPN 연결 개요
위의 환경 구성을 바탕으로, VPN을 다음과 같이 환경을 구성하였다.

     +——————————- VPN Tunnel ——————————–+
Linux     –+
(VPNGW)  |
NIC#1(e)  |
NIC#2      |
                |
PC1       –+—-+ 공유기 +—-+ ISP 공유기 +—-+ 인터넷 +—-+ 아이폰
NIC#3      |      NIC#5(e)            NIC#7(e)                                 NIC#9
                |      NIC#6                 NIC#8
PC2       –+
NIC#4

* e : external

집 내부 공유기 내부에서의 PC들간은 별도의 설정이 없어도 공유기에 연결한 것만으로
NIC#6를 통해 NIC#2, NIC#3, NIC#4끼리 통신할 것이다.

내부에서 외부로 접속하고자 한다면, NIC#5를 거쳐 나갈 것이다.

다만, 위의 경우와 같이 2개의 공유기를 거쳐야 한다면, NIC#5로부터 #8, #7을 거쳐 외부로
나갈 것이다.

Linux를 VPNGW로 삼고, 외부에서 이 Linux를 VPNGW로 접속하여 PC1,2로 연결하도록 하는
것이 목표이다.

3. OpenVPN-AS 설치
http://www.openvpn.net에 접속하여, OpenVPN-AS(Access Server)를 다운로드한다.
내 경우는 CentOS용 RPM을 다운로드하였고, 설치하였다.

passwd openvpn
을 실행하여, openvpn 계정의 비밀번호를 변경한다.
그러면, 추후 OpenVPN관리자 계정의 비밀번호로 사용할 수 있게 된다.

설치는 일반 OpenVPN 서버 설치 과정에 비해 OpenVPN-AS 설치 과정이 훨씬 간단했다.
(easy-rsa를 사용한 server, client 인증서 생성 등의 과정을 별도로 할 필요가 없다.)

정상적으로 설치가 되었다면, https://vpngw의 비공인 IP:943으로 접속하면,
OpenVPN-AS의 관리 페이지가 뜬다. 이 때, 인증서를 신뢰할 수 없다고 뜨면 무시하기를
눌러서 진행하자.

1) 서버용관리 – https://주소:943/admin
2) 클라이언트 – https://주소:943

서버용 페이지에 접속하여 살펴보면, 좌측의 큰 메뉴 기준으로 Status/Configuration/
User Management/Authentication/Tools 메뉴가 존재한다.

이 메뉴들 중, 실제로 내용 수정을 한 페이지 기준으로 기록한다.
* Status : 별도 수정 항목 없음
* Configuration
– License : 기본 라이센스 (2명)
– Server Network Settings
– Hostname or IP Address : 내 집에서 달고 나가는 공인 IP (공유기 관리웹에서 확인하거나, 내 IP를 확인해 주는 사이트 등을 통해 확인 가능)
– Interface and IP Address : NIC#2의 주소 기록
– VPN Mode : Layer 3 (routing/NAT)
– VPN Settings
– Dynamic IP Address Network : Network Address 디폴트값 그대로 사용 (ex – 172.27.224.0)
– Routing : using NAT
– Specify private subnet : NIC#2, #3, #4용 (ex – 192.168.1.0/24)
나머지 값들은 기본 값을 그대로 사용해도 된다.

이렇게 서버를 설정하고 나서, 클라이언트의 원활한 설정을 위해 집 내부망에서 아이폰으로
https://주소:943으로 접속해보자.
그러면, 클라이언트를 다운로드할 수 있는 링크가 출력되고, 아이폰의 경우 결국 AppStore에서
OpenVPN 클라이언트를 다운로드할 수 있도록 연결된다.

클라이언트에서 접속한 웹 페이지로부터 하단의 링크를 클릭하면,
직접 profile을 다운로드 할 수 있다. 다운로드한 파일을 OpenVPN 클라이언트에서 열기를
지정해주면, 결국 이 설정 파일은 OpenVPN 클라이언트에 import 되면서, 자동으로
프로파일이 추가된다.

(만약, OpenVPN-AS버전이 아니라 Community Edition으로 직접 수동 설치를 진행했다면,
인증서 파일 및 클라이언트 설정파일을 복사/수정하여 client.ovpn 파일을 만들어 주었어야
했을 것이며, opvn 파일 및 인증서 등을 itunes를 사용하여 동기화 해주거나, 이메일로
직접 전송해서 import시켜야 했을 것이다.)

이후, 아이폰의 네트워크를 3G/LTE 등 외부망으로 선택하고, OpenVPN 클라이언트를 통해
접속시도하면, 성공적으로 VPN 접속이 이뤄지는 것을 확인할 수 있다.

IP를 확인해보면, 터널IP를 새로 받은 것을 확인할 수 있으며, telnet 클라이언트를
이용하여 내부망에 있는 PC로 ping을 날려도 정상적으로 동작하는 것을 확인할 수 있다.

Written by everydayminder

December 24, 2013 at 23:58

Posted in linux, networking

FreeNX 설치 (CentOS 6.x; 64bits)

leave a comment »

VNC보다 성능이 좋다고 이름이 나있는 FreeNX (www.nomachine.com)을 설치하는 방법은 의외로 간단하다.

환경 : 서버측 CentOS6.4 (64bits)
클라이언트측 Windows7 (64bits)

CentOS6.x 기준으로 설치하고, 클라이언트 접속을 테스트해보자.
먼저 yum 명령어로 freenx를 다음과 같이 간편하게 설치할 수 있다.

freenx는 extras repository에 이미 있기 때문에

yum install freenx
yum install nxagent

(내 경우, nxagent를 처음에 설치하지 않았더니,
freenx는 정상적으로 설치하고, 계정까지 생성했지만, 접속이 실패하였고
로그를 보았더니 nxagent를 찾을 수 없다는 에러가 발견되었다.)

이 명령만으로도 freenx의 설치는 일단 완료된다.
freenx의 설정관련 내용은 /etc/nxserver에 설치된다.

server의 환경설정은 node.conf를 수정하는 것만으로 완료되는데,
node.conf를 백업해두고, node.conf.sample의 사본으로 작업하자.

mv node.conf node.conf.bak
cp node.conf.sample node.conf

vi node.conf를 실행하여, nxserver의 환경설정을 다음과 같이 변경/주석 해제한다.

SSHD_PORT=22 (주석 해제)
ENABLE_PASSDB_AUTHENTICATION="1"
ENABLE_SSH_AUTHENTICATION="1"

파일을 저장한다.

nxserver를 실행하면 여러가지 실행 옵션이 있다.
nxserver –status를 실행하여 현재 상태를 확인한다.

NX> 100 NXSERVER – Version 3.2.0-74-SVN OS (GPL, using backend: not detected)
NX> 110 NX Server is running
NX> 999 Bye

현재 설치된 버전의 3.2.0-74이고, 동작중이라는 것을 알 수 있다.

nxsever --stop

을 실행하면, freenx가 종료된다.

이제 사용자를 추가한다.

nxserver --adduser luran

freenx 접속을 위해 luran이라는 계정이 생성될 것이다.

nxserver --passwd luran

luran이라는 계정의 패스워드를 물어올 것이다.

여기까지 실행하면,
/home/luran/.ssh 디렉토리에 ssh 접속을 위한 키가 생성되었을 것이고,
/etc/nxserver에도 해당 ID용 공개키가 client.id_dsa.key 로 생성되었을 것이다.

이제 client.id_dsa.key파일 또는 파일의 내용을 실제 접속할 클라이언트에서 쓸 수 있도록 복사하자.
만약, SSH 기본 포트 이외의 다른 포트로 변경했다면 방화벽 룰도 변경해줘야 한다.

nxserver --start

를 실행하여 띄운다.

클라이언트에서 설정할 내용은 간단하다.
Windows의 경우, 3.5 버전의 NXClient를 구해서 설치한 후,

Host와 Port 정보를 기입하고, Key 버튼을 클릭하여 앞서 별도로 저장한 key 파일을 지정한다.
Desktop은 Unix/GNOME으로 하고, 접속속도는 원하는대로 설정한다.

앞서 생성한 계정정보를 입력하는 것으로, 설정을 모두 마쳤다.
이제 접속하여 창이 뜨는지 확인하자.

Written by everydayminder

December 4, 2013 at 13:06

Posted in linux, Uncategorized

Tagged with ,

Linux EPEL 설치 (metalink 에러 조치)

with 3 comments

Linux EPEL (Extra Packages for Enterprise Linux)을 설치하면서 겪은 것을 기록으로 남긴다.

L2TP VPN 솔루션 중, XL2TP를 설치하려고 하려고 관련 글들을 찾아보았다.

 yum install xl2tpd
 

블로그로부터 위와 같이 실행하면 되는 것으로 확인하고, 실행하였으나 설치가 되지 않는다.
기본 설정 상태의 yum repository들에는 xl2tpd가 존재하지 않기 때문이다.

xl2tpd가 존재하는 repository가 어디에 있는지 조사해 보니, Linux EPEL에 있다고 한다.
또한, 이를 위해 EPEL을 설정해 주어야 한다는 것을 확인했다.

 yum repolist
 

를 실행하면 기본적으로 epel이 아직 보이지 않는다.

다음과 같이 epel을 설정해 주자.

 wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
 rpm -Uvh epel-release-6-8.noarch.rpm
 

이후, yum repolist를 실행했더니,
다음 에러가 발생하였다.

 Error : Cannot retrieve metalink for repositroy: epel. Please verify its path and try again.
 

여러가지 방법을 시도해 보고, 다음과 같이 조치했더니 동작하였다.
/etc/yum.repos.d/epel.repo 파일을 아래와 같이 편집하였다.

조치 내용은 다음과 같다.
metalink를 참조하는 mirrorlist를 주석처리하고, 그 위의 baseurl을 그대로 사용하도록 주석해제한다.
enabled=1로 설정한다.

 [epel]
 name=Extra Packages for Enterprise Linux 6 - $basearch
 baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
 #mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
 failovermethod=priority
 enabled=1
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
 

그리고, 다시 yum repolist를 수행하니,
metalink 에러 없이, 정상적으로 repolist에 액세스하였고,

yum install xl2tp 도 수행할 수 있었다.

Written by everydayminder

November 15, 2013 at 08:08

Posted in linux

FreeRADIUS(2.2.10) + Oracle 연동 설정 (InstantClient 활용)

leave a comment »

– 환경 : CentOS6.4 (64비트)
– 준비물 : FreeRADIUS(2.2.10), Oracle Instantclient

1. 기본 설정
CentOS에서는 yum 명령어로 프로그램/라이브러리를 쉽게 설치할 수 있다.
설치 과정에서 ssl 관련 라이브러리에 대한 설정이 필요할 수 있으므로, 미리 다음과 같이 설치한다.

yum install openssl, openssl-devel

2. FreeRADIUS 설치를 위한 사전 준비
마찬가지로, FreeRADIUS도 yum 명령어로 설치할 수 있다.
만약, 설치하고자 한다면,

yum install freeradius

와 같이 실행하면 된다.

yum list | grep freeradius

를 수행하여 관련 라이브러리를 살펴보자.

freeradius-mysql.x86_64는 보이는데,
freeradius-oracle은 보이지 않는다.

결국, yum 명령어로는 FreeRADIUS와 Oracle을 위한 설정을 온전하게 할 수 없다.
따라서, FreeRADIUS 소스를 직접 다운로드하여 빌드해야 한다.

3. Oracle 클라이언트(라이브러리 준비)
Oracle을 해당 서버에 full installation을 했다면, 당연히 클라이언트까지 설치되어 있으므로,
아래 설치 관련 내용은 무시해도 된다.

본 설명은, Oracle Instantclient를 사용하는 방법을 기준으로 진행한다.
http://www.oracle.com으로부터 linux용(64비트) instantclient 라이브러리(basic, sdk)를 다운로드 한다.

- instantclient-basic-linux.x64-11.2.0.4.0.zip
- instantclient-sdk-linux.x64-11.2.0.4.0.zip

해당 파일들을 원하는 디렉토리에 압축풀어 놓자. (이하 $ORACLE_HOME)
basic과 관련된 파일들은 $ORACLE_HOME에,
sdk와 관련된 파일들은 $ORACLE_HOME/sdk/*에 풀리게 될 것이다.

4. FreeRADIUS 다운로드
http://www.freeradius.org로부터 freeradius-server-.2.2.1.tar.gz (또는 bz2) 파일을 다운로드하고,
원하는 디렉토리에 압축 푼다. (이하 $FREERADIUS_SRC)

5. FreeRADIUS 빌드
FreeRADIUS와 Oracle 라이브러리 연동이 잘 안된다는 블로그를 발견하여,
참고한 내용이다. (from Atif’s Blog : http://atif-razzaq.blogspot.kr/2011/01/freeradius-with-oracle.html)

해당 블로그 본문에 소개된 바와 같이 configure.in의 내용을 복사하여,
$FREERADIUS_SRC/src/modules/rlm_sql/drivers/rlm_sql_oracle/configure.in으로 덮어쓴다.

configure.in의 내용 참고

AC_INIT(sql_oracle.c)
AC_REVISION($Revision: 1.10 $)
AC_DEFUN(modname,[rlm_sql_oracle])

fail=
sql_oracle_ldflags=
sql_oracle_cflags=
if test x$with_[]modname != xno; then

AC_MSG_CHECKING([for oci.h])

dnl #
dnl # See if the user passed in the oracle_home_dir option and
dnl # use that first. If not, use $ORACLE_HOME. If that's
dnl # not defined, give up. There's no point in blindly
dnl # hunting around for Oracle - there's no standard place
dnl # for it. Any sane Oracle user/developer should have $ORACLE_HOME
dnl # defined anyways.
dnl #

dnl ############################################################
dnl # Check for command line options
dnl ############################################################

dnl extra argument: --with-oracle-version=VER
oracle_version=
AC_ARG_WITH(oracle-version,
[AS_HELP_STRING([--with-oracle-version=VER],
[Version of Oracle to search for. Should be 10 for Oracle 10g and 11 for 11g])],
[case "$withval" in
11)
oracle_version="$withval"
;;
10)
oracle_version="$withval"
;;
*)
AC_MSG_ERROR(Need oracle-version)
;;
esac])

dnl extra argument: --with-oracle-include-dir=DIR
oracle_include_dir=
AC_ARG_WITH(oracle-include-dir,
[AS_HELP_STRING([--with-oracle-include-dir=DIR],
[Directory where the Oracle includes may be found. It should be located under ORACLE_HOME if you have client SDK installed. Use --with-oracle-include-dir=yes if you are sure that your compiler include path includes Oracle include dir. Hint: you might try to do: locate oci.h])],
[case "$withval" in
no)
AC_MSG_ERROR(Need oracle-include-dir)
;;
yes)
;;
*)
oracle_include_dir="$withval"
;;
esac])

dnl extra argument: --with-oracle-lib-dir=DIR
oracle_lib_dir=
AC_ARG_WITH(oracle-lib-dir,
[AS_HELP_STRING([--with-oracle-lib-dir=DIR],
[Directory where the oracle libraries may be found. It should be located under ORACLE_HOME. iUse --with-oracle-lib-dir=yes if you are sure that your linker will find the necessary Oracle client libs. Hint: you might try to do: locate libclntsh.so])],
[case "$withval" in
no)
AC_MSG_ERROR(Need oracle-lib-dir)
;;
yes)
;;
*)
oracle_lib_dir="$withval"
;;
esac])

AC_TRY_COMPILE([#include ],
[ int a = 1;],
ORACLE_INCLUDE=" ",
ORACLE_INCLUDE=
)

RLM_SQL_ORA_WORKING_CFLAGS_FOR_LINKING_TEST=
if test "x$ORACLE_INCLUDE" = "x" ; then
old_CFLAGS="$CFLAGS"
CFLAGS="$old_CFLAGS -I$oracle_include_dir"
AC_TRY_COMPILE([#include ],
[ int a = 1;],
ORACLE_INCLUDE="-I$oracle_include_dir",
ORACLE_INCLUDE=
)

RLM_SQL_ORA_WORKING_CFLAGS_FOR_LINKING_TEST="$CFLAGS"
CFLAGS="$old_CFLAGS"
fi

# Proceed to linking makes only sense if include dir is OK.
if test "x$ORACLE_INCLUDE" != "x" ; then
old_LIBS="$LIBS"
old_CFLAGS="$CFLAGS"
CFLAGS="$RLM_SQL_ORA_WORKING_CFLAGS_FOR_LINKING_TEST"

ORACLE_LIBDIR_SWITCH=
if test "x$oracle_lib_dir" != "x" ; then
ORACLE_LIBDIR_SWITCH="-L${oracle_lib_dir} "
fi
if test "x$oracle_version" = "x" ; then
AC_MSG_RESULT(no)
AC_MSG_WARN([oracle version not found. Use --with-oracle-version={10|11}.])
fail="$fail Oracle version"
else
LIBS="$old_LIBS $ORACLE_LIBDIR_SWITCH -lclntsh -lnnz${oracle_version}"

AC_TRY_LINK([#include

static OCIEnv *p_env;
static OCIError *p_err;
static OCISvcCtx *p_svc;
static OCIStmt *p_sql;
static OCIDefine *p_dfn = (OCIDefine *) 0;
static OCIBind *p_bnd = (OCIBind *) 0;
],
[
int p_bvi;
char p_sli[20];
int rc;
char errbuf[100];
int errcode;

rc = OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0, /* Initialize OCI */
(dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *)) 0 );

],
ORACLE_LIBS="$ORACLE_LIBDIR_SWITCH -lclntsh -lnnz${oracle_version}",
ORACLE_LIBS=
)

LIBS="$old_LIBS"
CFLAGS="$old_CFLAGS"
fi
fi

if test "x$ORACLE_INCLUDE" = "x"; then
AC_MSG_RESULT(no)
AC_MSG_WARN([oracle headers not found. Use --with-oracle-include-dir=.])
fail="$fail oci.h"
else
sql_oracle_cflags="${sql_oracle_cflags} ${ORACLE_INCLUDE}"
AC_MSG_RESULT(yes)

if test "x$ORACLE_LIBS" = "x"; then
AC_MSG_WARN([oracle libraries not found. Use --with-oracle-lib-dir=.])
fail="$fail libclntsh libnnz${oracle_version}"
else
sql_oracle_ldflags="${sql_oracle_ldflags} $ORACLE_LIBS"
AC_MSG_RESULT(yes)
fi
fi

targetname=modname
else
targetname=
echo *** module modname is disabled.
fi

dnl Don't change this section.
if test "x$fail" != x; then
if test "x${enable_strict_dependencies}" = xyes; then
AC_MSG_ERROR([set --without-]modname[ to disable it explicitly.])
else
AC_MSG_WARN([silently not building ]modname[.])
AC_MSG_WARN([FAILURE: ]modname[ requires:$fail.]);
targetname=
fi
fi

AC_SUBST(sql_oracle_ldflags)
AC_SUBST(sql_oracle_cflags)
AC_SUBST(targetname)
AC_OUTPUT(Makefile)

$FREERADIUS_SRC로부터 다음과 같이 실행한다.

./configure --with-oracle-version=11 --with-oracle-include-dir=$ORACLE_HOME/sdk/include --with-oracle-lib-dir=$ORACLE_HOME
make
make install

만약, 성공적으로 설정이 되고, 빌드되었다면, /usr/local/lib에 rlm_sql_oracle.* 파일들이 보여야 한다.

그러나, 나의 경우 rlm_sql_oralce.* 파일들이 존재하지 않았다.
$FREERADIUS_SRC/src/modules/rlm_sql/drivers/rlm_sql_oracle/config.log 파일을 열어 실패 사유를 찾아보자.

내 경우는, 오라클 라이브러리 설정을 해줬는데도 불구하고, 관련 라이브러리를 찾을 수 없으니,
–with-oracle-lib-dir 옵션을 사용하여 위치를 지정하라는 에러 메시지가 있었다.
(그러나, 위에서 이미 옵션을 제대로 준 상태임)

다시, $ORACLE_HOME으로 이동해 보자.
내 경우, config.log상, libnnz와 libclntsh를 찾을 수 없다는 에러가 있었기에, 다음과 같이 soft link를 걸어 주었다.

ln -s libclntsh.so $ORACLE_HOME/libclntsh.so.11.1
ln -s libnnz.so $ORACLE_HOME/libnnz11.so

그리고 다시, 위의 과정 (configure 부터 make install까지 )을 반복하였다.
그랬더니, 빌드 성공!

/usr/local/lib/rlm_sql_oracle* 파일들이 생긴 것을 확인할 수 있다.

4. 시범 운전 확인
radiusd -X를 실행하여, 정상적으로 일단 뜨는지 보자.
별 에러 없이 뜨고, 사용자로부터 인증 요청 대기한다는 메시지가 뜬다면 일단 설치/ 1차 설정은 성공한 것이다.

5. file 기반 사용자 추가/ 인증 테스트
빌드를 성공적으로 했다면, 기본적으로 /usr/local/etc/raddb에 설정파일 들이 복사가 되었을 것이다. (이하 $FREERADIUS_CONF)
radiusd를 종료시키고, $FREERADIUS_CONF/users 파일을 편집하자.

빈 칸에,

 luran Cleartext-Password := "letmein"
 Reply-Message = "Hello, %{User-Name}"
 

이라고 추가로 적어주고, users 파일을 저장한다.

다시, radiusd -X를 실행시키고,

 radtest luran letmein localhost 0 testing123
 

이라고 입력한다.

($FREERADIUS_CONF/clients.conf에 기본적으로 localhost에서 접속하는 클라이언트의 경우,
secret이 testing123으로 설정되어 있다.)

정상적으로 동작한다면,
Access-Accept 메시지를 수신한다.

6. FreeRADIUS – SQL 인증 설정

– radiusd.conf 편집
$FREERADIUS_CONF/radiusd.conf 파일내 sql 설정 주석을 없앤다.

 $INCLUDE sql.conf
 

– sql.conf 편집
$FREERADIUS_CONF/sql.conf 파일을 열고, oracle 관련 설정을 해준다.

 database = "oracle"
 server = "DB서버 IP"
 port = 포트번호
 login = 사용자계정
 password = 계정비밀번호
 

등으로 내용을 고친다.

 # radius_db = "radius"
 radius_db = "(DESCRPTION=(ADDRESS(=(PROTOCOL=TCP)(HOST=DB서버IP)(PORT=DB포트))(CONNECT_DATA=(SID=SID이름)))"
 

– sites-enabled/default
$FREERADIUS_CONF/sites-enabled/default 파일을 열어서,
sql 이 필요한 모듈 별로, sql 옵션을 주석 해제한다.

내 경우는 일단, authorize 모듈에서만 sql 주석을 해제했다.

7. 인증에 필요한 스키마 생성
$FREERADIUS_CONF/sql/oracle 디렉토리내 관련 sql 들이 복사되어 있을 것이다.
이중 schema.sql을 사용하여, 필요한 스키마를 생성해준다.

8. 재실행 및 환경 변수 확인

 radiusd -X
 

를 실행한다.

내 경우, libclntsh.so.11.1을 찾을 수 없다고 에러가 발생하면서, FreeRADIUS가 시작되지 않았다.
그래서, 환경변수에 LD_LIBRARY_PATH=$ORACLE_HOME을 추가해 주었다.

 export LD_LIBRARY_PATH=$ORACLE_HOME
 

그리고, 다시 radiusd -X를 실행하여 정상 실행을 확인하였다.

9. 인증 데이터 생성/ 인증 확인
DB에 테스트용 사용자를 넣고, 정상적으로 인증되는지 확인해 보자.

 INSERT INTO radcheck VALUES(radcheck_seq.NEXTVAL, 'dbuser', 'Cleartext-Password', ':=', 'dbpass');
 commit;
 

이제 사용자가 추가되었으므로, 접속 테스트를 한다.

 radtest dbuser dbpass localhost 0 testing123
 

이제 앞서 파일 기반으로 인증 테스트 했던 것과 동일하게 Access-Accept 메시지가 뜨는 것을 확인할 수 있다.

10. 기타
$FREERADIUS_CONF/sql.conf 파일의 맨 끝에 보면,

 $INCLUDE sql/${database}/dialup.conf
 

라는 설정이 눈에 띈다.

이 파일에 기록된 내용을 보면,
authorize_check_query, authorize_reply_query 등의 설정이 있다.
해당 설정부를 보면, “SELECT ~ FROM”과 같은 쿼리문이 보이는데,
앞서 생성한 스키마에 이 쿼리문을 수행하여 인증한다고 보면 된다.

즉, 우리가 사용할 쿼리문이 따로 있거나, 스토어드 프로시저를 호출해야 한다면, 이 부분을 변경하면 될 것이다.
(검증은 나중에 다시)

Written by everydayminder

October 25, 2013 at 01:48

Posted in linux

yum lock 해제하기

leave a comment »

만약, 비정상적인 종료 등으로 인해 yum이 lock이 걸렸고,
기다려도 풀리지 않는다면, 다음과 같이 강제로 lock을 해제시킬 수 있다.

cat /var/run/yum.pid

을 실행시켜서 확인 후,

불필요하다면 해당파일을 지워준다.

Written by everydayminder

October 23, 2013 at 08:21

Posted in linux