질문/답변 페이지 많이 이용해 주세요.

Archive for the ‘Linux’ Category.

vim 간략 노트 base64 파일 다루기편

메일에서 많이 사용되는 인코딩 방식으로 base64가 있습니다.

base64인코딩을 openssl과 같이 사용하면서 발생했던 문제에 대하여 vim을 통해 간단히 작업한 내용을 메모해 둡니다.

메일을 받아보면 아래와 같은 base64 인코딩 영역이 있습니다.

Content-Type: text/html; charset=euc-kr
Content-Transfer-Encoding: base64

PGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0i
dGV4dC9odG1sOyBjaGFyc2V0PWV1Yy1rciI+DQo8dGl0bGU+vsiz58fPvLy/5C4gvcXH0cSrteXA
1LTPtNkuPC90aXRsZT4NCjwvaGVhZD4NCiANCjxib2R5Pg0KPCEtLUhlYWRlciBTdGFydCAtLT4N
Cjx0YWJsZSB3aWR0aD0iNzAwIiBib3JkZXI9IjAiIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5n
PSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9ImJhY2tncm91bmQ6dXJsKGh0dHA6Ly9jYXJkaW1h
Z2Uuc2hpbmhhbmNhcmQuY29tL2ltZy9lbWFpbC9jb21tb24vMjAxMTExL2JnX0hlYWRlcl9iYXNp

위 내용은 줄바꿈문자를 있는 그대로 붙여 넣은 것입니다.

한 줄의 문자수가 77개 입니다. 위 내용의 경우는 openssl enc -d -a 명령을 통해 정상적으로 디코드하여 볼 수 있었습니다.

하지만, openssl에서 base64인코딩을 하면 보통, 한 줄이 64자리인 것을 많이 봅니다.

그래서, 이번에는 위와 같이 줄의 문자수가 맞지 않을 때, 줄을 맞추는 vim 명령을 해봤습니다.

# 내용에서 줄바꿈 문자를 모두 제거하기
:%s/\n//
# 임의의 글자수를 찾고 찾은문자열 + 줄바꿈 문자로 대치하기
:%s/\(.\{64\}\)/\1\r/g

위 첫 번째 치환은 간단합니다. ‘\n’줄바꿈문자를 찾아서 ”로 대체합니다. 즉, 줄바꿈문자를 지워 한줄로 만듭니다.

두 번째 치환은 제가 잘 안해보던 것이라 좀 시간이 걸렸습니다.
1. ‘\(\)’ 임의의 찾은 문자열을 대체될 영역에서 사용할 때 사용하는 구문입니다. ‘\1’ 형태로 참조하여 사용했습니다.
2. ‘\{\}’ 바로 앞 문자(현재는 임의문자(‘.’))의 반복 횟수를 나타냅니다.

즉, 임의의 문자가 64번 반복되는 패턴을 찾은 후, ‘\1\r’형태로 해당문자와 줄바꿈문자로 대체하였습니다.

일부 메일에서 base64인코딩이지만, 글자수가 openssl과 호환되지 않는 형태로 오는 메일을 다뤄본 후 간단히 작업해본 vim 경험입니다.

ps. 검색어 : vim 문자반복 치환 문자갯수 줄바꿈

mysql root 패스워드 까먹었을 때.

mysql root 패스워드를 까먹었을 때. 복구하는 방법……

구글링한다.

http://www.google.com/search?q=mysql+root+password+recovery

첫 번째 링크를 클릭한다.
OS에 맞는 링크를 클릭한다.

아래와 같은 명령으로 복구한다.
( 아래는 ubuntu 예제 )

# cat > /tmp/rootpassword.sql
UPDATE mysql.user SET Password=PASSWORD('password') WHERE User='root';
FLUSH PRIVILEGES;

# kill `cat /var/run/mysqld/mysqld.pid` && sleep 3 && ps -ef | grep mysql && mysqld_safe --init-file=/tmp/rootpassword.sql &

LDAP 을 사용하여 계정관리 통합하기

Directory Server를 구축하여, 여러 가지 애플리케이션의 인증 관리를 통합할 수 있습니다.

저는 uid={id},ou=Users,dc=dgkim,dc=net 이란 이름의 인증 디렉토리를 구축하여 사용할 수 있습니다.

그리고, 아래와 같은 로그인에 LDAP의 ID, Password를 활용하고 있습니다.

웹애플리케이션 인증

JAAS를 활용하여 인증에 LDAP을 사용하고 있습니다.

서블릿 웹 모듈에서 JAAS 활용하기

아래 web.xml 설정을 통해서 웹모듈에서 컨테이너가 제공하는 UserPrincipal 과 Role 정보를 활용할 수 있습니다.

web.xml : admin, user 롤을 정의하고, user 롤에 속하는 사용자가 사용할 수 있도록 구성.

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/login_form.jsp</form-login-page>
            <form-error-page>/login_error.jsp</form-error-page>
        </form-login-config>
    </login-config>
    <security-role>
        <role-name>Admin</role-name>
    </security-role>
    <security-role>
        <role-name>User</role-name>
    </security-role>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>test web application</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>User</role-name>
        </auth-constraint>
    </security-constraint>
</web-app>

그리고, request.getUserPrincipal() 을 호출하면, 로그인에 사용한 ID를 추출할 수 있으며, request.isUserInRole(“User”) 형태로 사용자가 특정 롤을 가지는지 확인할 수 있습니다.

OC4J 10.1.3에서 JAAS 서비스를 제공하는 구성

OC4J에서 컨테이너의 보안 제공자와 서블릿간의 연동을 위한 정보를 구성합니다.

컨테이너 보안 제공자에서 제공하는 사용자, 그룹 정보를 서블릿의 UserPrincipal, Role 정보와 매핑해 줍니다.

<?xml version="1.0"?>

<orion-application  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/orion-application-10_0.xsd"  deployment-version="10.1.3.3.0" default-data-source="jdbc/OracleDS" component-classification="external"
  schema-major-version="10" schema-minor-version="0" >
        <web-module id="certmanager" path="certmanager.war" />
        <persistence path="persistence" />
        <jazn provider="XML" >
                <property name="custom.ldap.provider" value="true" />
        </jazn>
        <jazn-loginconfig>
                <application>
                        <name>bisu</name>
                        <login-modules>
                                <login-module>
                                        <class>oracle.security.jazn.login.module.LDAPLoginModule</class>
                                        <control-flag>required</control-flag>
                                        <options>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.user.object.class</name>
                                                        <value>inetOrgPerson</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.provider.connect.pool</name>
                                                        <value>true</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.provider.type</name>
                                                        <value>Other</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.provider.credential</name>
							<value>{password}</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.provider.url</name>
                                                        <value>ldap://localhost:389</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.role.searchscope</name>
                                                        <value>onelevel</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.user.searchscope</name>
                                                        <value>onelevel</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.role.searchbase</name>
                                                        <value>ou=Groups,dc=dgkim,dc=net</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.user.searchbase</name>
                                                        <value>ou=Users,dc=dgkim,dc=net</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.role.object.class</name>
                                                        <value>groupOfUniqueNames</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.role.name.attribute</name>
                                                        <value>cn</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.provider.user</name>
                                                        <value>uid=Administrator,ou=Users,dc=dgkim,dc=net</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.user.name.attribute</name>
                                                        <value>uid</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.membership.searchscope</name>
                                                        <value>direct</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.lm.cache_enabled</name>
                                                        <value>false</value>
                                                </option>
                                                <option>
                                                        <name>oracle.security.jaas.ldap.member.attribute</name>
                                                        <value>uniqueMember</value>
                                                </option>
                                        </options>
                                </login-module>
                        </login-modules>
                </application>
        </jazn-loginconfig>
        <log>
                <file path="application.log" />
        </log>
</orion-application>

웹로직 보안제공자를 사용한 LDAP인증

웹로직에서 도메인 단위 보안제공자에서 LDAP 인증을 활용하는 방법을 설명합니다.

웹로직 콘솔에서 LDAP 로그인 모듈 등록하기

  1. 보안영역 선택
  2. Realm 선택(기본 myrealm)
  3. 제공자 탭의 인증 탭 선택
  4. 새로만들기
  5. 이름을 주고, 유형을 LDAPAuthenticator 선택
  6. 생성한 제공자 선택
  7. 구성 탭의 제공자별 탭 선택
  8. LDAP 정보 등록 : 호스트, 포트, 사용자 기본 DN, 그룹 기본 DN
  9. 구성 탭의 공통 탭 선택
  10. 콘트롤 플래그를 SUFFICIENT 선택
  11. 제공자 탭의 인증 탭으로 이동
  12. 순서 재지정 선택
  13. 생성한 제공자를 최상위로 이동
  14. 도메인 내의 서버를 재시작

위 구성을 하면, LDAP 인증을 먼저 수행하고, weblogic의 내장 사용자를 검색하게 됩니다.

아래는 웹모듈에서 위에서 지정한 JAAS를 활용하는 것에 대한 구성파일입니다.

weblogic.xml : admin 롤에 대한 사용자 및 그룹을 Administrators로 지정. ( LDAP에 그룹이 Administrators인 경우 admin 롤을 가짐 )

<weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"
                  xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app">
  <security-role-assignment>
    <role-name>Admin</role-name>
    <principal-name>Administrators</principal-name>
  </security-role-assignment>
</weblogic-web-app>

Tomcat 보안제공자를 사용한 LDAP인증

Tomcat에서 LDAP 인증을 활용하는 방법을 설명합니다.

Tomcat에서 server.xml 내부의 Engine설정 항목에 Realm 항목의 설정을 통해서 설정할 수 있습니다.
아래는 기본 설정의 내용입니다.

    <Engine name="Catalina" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

위 구성은 기본적으로 제공되는 파일기반 보안 제공자를 사용하는 예입니다.

해당 보안제공자는 conf/tomcat-users.xml 파일에서 정의되어 있습니다.

아래 구성은 tomcat-users.xml과 추가로 LDAP 인증을 같이 사용하는 예제입니다.

    <Engine name="Catalina" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.CombinedRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
        <Realm className="org.apache.catalina.realm.JNDIRealm"
               connectionURL="ldap://localhost:389"
               userPattern="uid={0},ou=Users,dc=dgkim,dc=net"
               roleBase="ou=Groups,dc=dgkim,dc=net"
               roleName="cn"
               roleSearch="(uniqueMember={0})"/>
      </Realm>

위 구성을 하면, LDAP에 기록된 인증정보와 tomcat-users.xml에 정의된 인증정보를 사용할 수 있습니다.

아래는 웹모듈에서 위에서 지정한 JAAS를 활용하는 것에 대한 구성파일입니다.
( weblogic이나 oc4j와 달리 서블릿컨테이너 디플로이먼트 디스크립터를 사용하지 않고, 표준 디스크립터를 통해서 바로 사용가능합니다. )
/* 즉, 모든 리소스는 Users롤을 가진 사용자(ldap에서는 그룹)가 접근할 수 있도록 한 예입니다.


    
        BASIC
    
    
        Users
    
    
        
            allresources
            /*
        
        
            Users
        
    

TRAC 인증

Trac에 로그인 모듈은 Apache의 mod_auth_ldap을 사용하면 LDAP으로 로그인을 할 수 있습니다.

<Location /trac>
   SetHandler mod_python
   PythonInterpreter main_interpreter
   PythonHandler trac.web.modpython_frontend
   PythonOption TracEnvParentDir /TRAC
   PythonOption TracLocale ko_KR.utf8
   PythonOption TracUriRoot /trac

   AuthType Basic
   AuthName "LDAP Authentication Information"
   AuthBasicProvider "ldap"
   AuthLDAPURL "ldap://localhost:389/ou=Users,dc=dgkim,dc=net?uid?sub?(objectClass=*)"
   AuthzLDAPAuthoritative Off
   Require valid-user
</Location>

SVN 레포지토리 인증

Trac과 마찬가지로 mod_auth_ldap 모듈을 통해 LDAP 인증을 수행할 수 있습니다.

<Location /repository1>
    DAV svn
    SVNPath /repository1
    AuthType Basic
    AuthName "LDAP Authentication Information"
    AuthBasicProvider ldap
    AuthLDAPURL "ldap://localhost:389/ou=Users,dc=dgkim,dc=net?uid?sub?(objectClass=*)"
    AuthzLDAPAuthoritative Off
    Require valid-user
</Location>

MAIL 등 네트워크 서비스 인증

Cyrus IMAP 등 유닉스 기반의 네트워크 서비스들은 기본적으로 LDAP을 통한 인증이 가능하도록 준비되어 있습니다.
아래는 Cyrus IMAP에서 사용하는 SASL 인증용 설정 파일 내용입니다.

ldap_servers: ldap://127.0.0.1/
ldap_bind_dn: uid=Administrator, ou=Users, dc=dgkim, dc=net
ldap_bind_pw: {password}
ldap_default_domain: dgkim.net
ldap_search_base: ou=Users, dc=dgkim, dc=net
ldap_filter: (uid=%U)

Thunderbird에서 LDAP을 등록하면, 주소록 검색에도 활용할 수 있고, 만약 LDAP에 인증서가 등록되어 있다면, 보안메일 발송시에 Thunderbird가 자동으로 인증서를 검색해주는 특징도 활용할 수 있습니다.

OS 리눅스 인증

LDAP을 심지어 OS인증에도 사용할 수 있습니다.
Ubuntu linux에 LDAP 인증을 세팅해 본적이 있는데, 현재는 해당 시스템이 없어 설정을 소개할 수 없네요.

최근에 whity 마련과 함께 OS 인증을 테스트하였습니다.

ubuntu 에서 아래 명령으로 패키지 설치 만으로 어렵지 않게 세팅되었습니다. ( 단, 너무 간단하게 해버려서 상관관계는 잘 모르겠습니다. )

apt-get install libpam-ldapd

위 명령을 치면 libpam-ldapd 패키지와 함께 libnss-ldapd nscd nslcd 패키지가 추가로 설치됩니다.
설치후 기본적인 LDAP 정보만 알려주면 쉽게 사용할 수 있습니다. ( 심지어 search base도 일일이 지정할 필요가 없이, root dn만 주고 사용중입니다. )

그밖에…

LDAP 서버를 구축해 두면, 다양한 프로그램에서 인증에 활용할 수 있습니다. 본 블로그의 경우도 WordPress에 LDAP 플러그인을 설치하여, 로그인에 LDAP 서버를 통하고 있습니다.

Apache와 OC4J 연동하기.

Oracle Application Server는 크게 Oracle HTTP Server(Apache MOD)와 OC4J(Oracle Container for J2EE)로 구성되어 있습니다.

그런데, OC4J의 경우 단독으로도 사용할 수 있도록 Standalone 버전으로 Oracle에서 제공하고 있습니다.

만약, 서버를 저와 같이 PHP나 다른 Apache의 기능을 사용하고, OAS를 사용할 수 없는 환경에서 Apache와 OC4J를 연동하여 사용하는 방법을 알려드립니다.(물론 이미 알고 있는 분도 계시겠지만.)

먼저, Apache와 OC4J의 연동은 OAS 에서는 mod_oc4j 라는 모듈을 통해 처리합니다.
그러나, mod_oc4j는 OAS에 맞도록 작성되어 단독 Apache에 쓰기에는 무리가 있습니다.

다음으로, AJP를 통해 OC4J와 연동하는 것이 가능합니다.
그러나, 톰캣에서 제공하는 AJP 모듈과 OC4J모듈의 연동에서는 알 수 없는 문제가 발생했었습니다.

다음은, proxy 모듈을 사용하는 방법입니다.(이 방법을 소개합니다.)

저의 경우 Apache 2.2 버전에서 제공되는 proxy 모듈로 사용하고 있습니다.

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so

위와 같이 모듈이 활성화 된 상태에서 아래와 같이 설정하여 OC4J와 연동이 가능합니다.

ProxyPass /ical2bi http://localhost:8888/ical2bi

위 설정은 Apache 웹서버에 /ical2bi 형태로 접근할 경우, OC4J의 /ical2bi 로 요청을 넘겨줍니다.

이 방법의 경우, 일반적으로 잘 돌아가지만, redirect 등과 같이 서버 주소를 참조하는 경우에는 정상 동작하지 않는 경우도 발생할 수 있습니다.

proxy 모듈을 통해서 저는 OC4J의 예제만 보여드렸습니다만, OC4J 뿐 아닌 다른 WAS나 심지어 다른 웹서버까지 요청을 전달할 수 있습니다.

저는 하나의 서버에 여러개의 애플리케이션을 돌리고, 각각 접근하는 URL에 따라 애플리케이션을 구분하여 서비스하고 있습니다.

ps. 제 서버에는 개발에 사용된 언어가 PHP, Python, Java, CGI(Perl) 입니다. 이중 Java부분을 OC4J로 처리하고 있습니다.

Tomboy + ( Snowy | Ubuntu One ) 메모짱

오늘은 Tomboy라는 메모장 프로그램을 소개합니다.

Tomboy Icon Tomboy Logo

http://projects.gnome.org/tomboy/

리눅스 GNOME 프로젝트로 만들어진 프로그램입니다.

저는 atnote, 한컴노트 등의 메모용 프로그램을 사용해 봤습니다.

그 프로그램들은 윈도우 창 모양 등을 최소화하고, 바탕화면 등에 배치해서 사용하기에 좋게 만들어진 것으로 보입니다.

그러나, Tomboy는 그와는 달리 창 모양도 갖추고 있으며, 심지어 툴바까지 있어서 바탕화면에 띄워둘 만한 프로그램은 아닙니다.

강점으로는 위키와 같이 페이지간 링크을 줄 수 있다는 점입니다.

또한, 백링크도 되며, 검색도 쓸만하게 만들어져 있어서 좋습니다.

아래는 윈도우용 설치에 대한 링크입니다.

http://live.gnome.org/Tomboy/Win32

추가로 소개해 드릴 것은, Snowy라는 프로젝트와 Ubuntu One서비스입니다.

Snowy는 Tomboy노트를 웹에 싱크해주는 프로그램입니다. 아직은 웹에서 조회만 가능하며 작성은 불가능합니다.

http://live.gnome.org/Snowy

설치형 버전을 사용을 원하시면, Snowy를 자체 서버에 설치하고 사용하시면되고,

Ubuntu One이란 서비스를 사용하셔도 되겠습니다. ( Ubuntu One의 경우 Ubuntu를 기준으로 Tomboy 와 추가 동기화를 제공합니다. )

https://one.ubuntu.com/

ps. 예전에는 Freemind를 통해서 구조화를 했었고, notepad로 디렉토리에 txt파일 형태로도 저장해 봤습니다. 이런 방식의 경우 검색이 가장 문제가 되었습니다. Microsoft의 Onenote의 경우 자체 저장 포맷을 사용하여 사용하지 않는 사람입니다.

OpenVPN으로 가상사설망 구축하기

OpenVPN으로 가상 사설망 구축이 가능합니다.

http://openvpn.net/

1. OpenVPN 서버 설치

$ sudo apt-get install openvpn

openvpn용 dh파일 만들기

$ openssl dhparam -out dh1024.pem 1024

openvpn 서버용 설정파일 만들기

port 1194
proto udp
dev tun0

ca ca.crt
cert server.crt
key server.key

dh dh1024.pem

server 10.8.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

push "route 168.126.63.1 255.255.255.255"
push "route 168.126.63.2 255.255.255.255"

client-to-client

keepalive 10 120

comp-lzo

persist-key
persist-tun

status openvpn-status.log

verb 3

위 구성은 아래 내용으로 요약합니다.

  • 클라이언트가 접속할 포트는 udp 1194 입니다.
  • 10.8.0.0/24 를 클라이언트에게 할당할 IP 풀로 사용합니다.
  • 클라이언트가 168.126.63.1, 168.126.63.2 로 접근할 때, VPN 접속을 사용하도록 합니다.
  • 클라이언트간 통신이 가능합니다.

서버에서는 매스커레이딩 혹은 라우팅 설정이 있어야 정상적으로 사용할 수 있습니다. ( 10.8.0.0/24의 사설 IP풀을 사용하므로 )

2. 클라이언트 사용하기

아래 URL에서 클라이언트 프로그램을 받을 수 있습니다. 윈도우에서 사용하는 GUI인터페이스를 제공하는 클라이언트입니다.

http://openvpn.se/

설치후, 클라이언트용 설정을 아래와 같이 생성합니다.

client
dev tun
proto udp

remote vpn-server.dgkim.net 1194

nobind

persist-key
persist-tun

ca cacert.pem
cert dgkimcert.pem
key dgkimkey.pem

verb 3
comp-lzo

Apache DAV를 사용하여 웹폴더 활용

아파치에서 제공되는 mod_dav 모듈을 사용하여 웹폴더를 사용할 수 있습니다.

http://httpd.apache.org/docs/2.2/mod/mod_dav.html

간단한 웹폴더 설정 예제

Alias /dav "/home/www/dav"
<Location /dav>
    Dav On
    <LimitExcept GET OPTIONS>
        Order deny,allow
        Deny from all
        Allow from 10.8.0.0/255.255.255.0
    </LimitExcept>
<Location>

/dav 경로를 웹폴더로 지정하였으며, IP주소가 10.8.0.0/24인 사용자만 사용할 수 있도록 제한한 예입니다.(저는 VPN접속으로 사용하고 있습니다.)

dav 모듈을 켠 상태에서 location 설정 등에 Dav On 이란 설정으로 웹폴더 기능이 활성화됩니다.

추가로, LDAP으로 로그인 모듈을 사용할 수도 있습니다. ( 다음 기회에 )