>> Read No. 1116 article  
MySQL을 이용한 ProFTP 사용자 관리

등록 2001-04-04 11:04:00     조회 4
이름 유택연    

		<PRE>
MySQL을 이용한 ProFTPD 사용자 관리
==================================
 ProFTPD는 일반계정, PAM, LDAP, MySQL, PostgreSQL 등 사용자 제어를 위한 다양한
옵션을 제공한다. 이 장에서는 이 중 MySQL 플러그인을 통하여 사용자를  제어하는
방법을 알아본다.
이때의 장점은 FTP 인증을 위하여 시스템에 지저분하게 사용자 계정을 추가할 필요
가 없으므로, 사용자 관리가 간편하고 해킹의 위험이 어느 정도 줄어든다고 할 수
있다.
 <참고> 여기서는 레드헷 리눅스 7.0을 중심으로 설명을 하고 있으며, 다른 배포판
       사용자들은 각자의 환경에 맞게 필요한 부분을 바꿔서 하기 바란다.
       또한 이글을 읽는 사람이 어느 정도 리눅스 또는 유닉스 관리에 익숙하다는
       것을 전제로 한다.
 - 준비물:
  o Proftpd 1.2.1 - ftp://ftp.nuri.net/pub/mirrors/ftp0.sunet.se/mandrake-devel/SRPMS/proftpd-1.2.1-5mdk.src.rpm   o M
ySQL 3.23.36 - http://www.mysql.com/Downloads/MySQL-3.23/MySQL-3.23.36-1.src.rpm  위의 두 파일을 다운로드 받
아 /usr/src/redhat/SRPMS 디렉토리에 저장한다.  - MySQL 설치    우선 소스 RPM을 설치한다.
   $ cd /usr/src/redhat/SRPMS
  $ rpm -ivh MySQL-3.23.36-1.src.rpm
 
  RPM 패키지를 만들기 전에 배포판과의 호환성을 위해 .SPEC 파일을 수정한다.
  크게 중요한 항목은 아니나, 레드햇 배포판에서 php_mysql 등의 패키지에서는
  mysql (대소문자 주의) 패키지를 검색하여 의존도를 검사한다.
   $ cd ../SPECS
  $ vi mysql-3.23.36.spec
   VI 편집기에서 .SPEC 파일을 열고 아래의 각 행의 내용을 다음과 같이 바꿔준다.
   * Line #8
       Name: MySQL
    -> Name: mysq
   * Line #87
       Requires: MySQL-client MySQL-DBI-perl-bin perl
    -> %{Name}-client %{Name}-DBI-perl-bin perl
   * Line #107
       Requires: MySQL-client
    -> Requires:%{Name}-client
   * Line #142
       CC="${MYSQL_BUILD_CC:-egcs}"
    -> CC="${MYSQL_BUILD_CC:-gcc}"
   * Line #144
       CXX="${MYSQL_BUILD_CXX:-egcs}"
    -> CXX="${MYSQL_BUILD_CXX:-gcc}"
   위의 내용을 편집하였다면 저장한 후 VI 편집기를 종료한다.
  이번에 해야 할 일은 소스를 컴파일하고 RPM 패키지를 만드는 작업이다. 패키지
  컴파일이 끝나면 생성된 패키지를 설치한다.
   $ rpm -bb --clean --rmsource --rmspec mysql-3.23.36.spec
  $ cd ../RPMS/i386
  $ rpm -Uvh mysql-3.23.36-1.i386.rpm
  $ rpm -Uvh mysql-client-3.23.36-1.i386.rpm
  $ rpm -Uvh mysql-shared-3.23.36-1.i386.rpm
  $ rpm -Uvh mysql-devel-3.23.36-1.i386.rpm
    (필요없다면 이 패키지 설치는 하지 않아도 된다.)
   이제 여러분의 리눅스에 MySQL이 설치되었다. ntsysv 를 실행한 후 mysql 서비스가
  자동으로 시작하도록 해준다. 그리고 mysql 데몬을 실행해 두자.
   $ ntsysv
  $ /etc/rc.d/init.d/mysql start
 - ProFTPD 설치
   이번에도 먼저 소스 RPM을 설치한다.
   $ cd /usr/src/redhat/SRPMS
  $ rpm -ivh proftpd-1.2.1-5mdk.src.rpm
   기본 컴파일 옵션에는 SQL 지원 부분이 빠져 있으므로, MySQL 데이타베이스를 이
  용하기 위해서는 컴파일 옵션을 변경해 주어야 한다.
  추가할 옵션은 --with-modules=mod_sql:mod_sql_mysql 이다.
   $ cd ../SPECS
  $ vi proftpd.spec
   아래 행의 내용을 변경한다.
   * Line #48
       --with-modules=mod_linuxprivs:mod_ratio:mod_readme:mod_pam:mod_quota
    -> --with-modules=mod_sql:mod_sql_mysql:mod_linuxprivs:mod_ratio:mod_readme:mod_pam:mod_quota
   위와 같이 변경하였으면 저장한 후, 종료한다.
  패키지를 만들 준비가 되었으므로 이번엔 패키지를 만들고 설치한다.
   $ rpm -bb --clean --rmsource --rmspec proftpd.spec
  $ cd ../RPMS/i386
  $ rpm -Uvh proftpd-1.2.1-5mdk.i386.rpm
 - ProFTPD를 위한 MySQL 데이타베이스 생성
   모든 패키지가 정상적으로 설치가 되었으면, 이제 ProFTPD에서 참조할 테이블을
  생성한다. 테이블의 레이아웃은 아래와 같이 구성된다.
 
  * 테이블명: users
    +---------+------------------+------+-----+---------+-------+
    | Field   | Type             | Null | Key | Default | Extra |
    +---------+------------------+------+-----+---------+-------+
    | userid  | char(12)         |      | PRI |         |       |
    | uid     | int(10) unsigned | YES  |     | NULL    |       |
    | gid     | int(10) unsigned | YES  |     | NULL    |       |
    | passwd  | char(63)         | YES  |     | NULL    |       |
    | shell   | char(255)        | YES  |     | NULL    |       |
    | homedir | char(255)        | YES  |     | NULL    |       |
    | count   | int(10) unsigned |      |     | 0       |       |
    | valid   | int(10) unsigned | YES  |     | NULL    |       |
    +---------+------------------+------+-----+---------+-------+
    - userid : 사용자 계정 이름 (Primary Key)
    - uid    : 사용자 UID (있어도 그만, 없어도 그만 emoticon; 넣을때는 각 userid별로 다르게)
    - gid    : 사용자가 속한 그룹의 GID (있어도 그만, 없어도 그만 emoticonemoticon
    - passwd : 로그인에 사용할 패스워드
    - shell  : 로그인 시 사용할 쉘
    - homedir: 계정 홈 디렉토리 (NULL 일 경우는 데몬설정에 따른다)
    - count  : 현재까지 누적된 방문 횟수
    - valid  : 계정을 임시로 막을 때 사용하기 위한 추가 필드
   * 테이블명: groups
    +---------+------------------+------+-----+---------+-------+
    | Field   | Type             | Null | Key | Default | Extra |
    +---------+------------------+------+-----+---------+-------+
    | gname   | char(12)         |      | PRI |         |       |
    | gid     | int(10) unsigned |      |     | 0       |       |
    | members | text             | YES  |     | NULL    |       |
    +---------+------------------+------+-----+---------+-------+
    - gname  : 그룹 이름 (Primary Key)
    - gid    : gname의 GID
    - members: 콤마(,)로 구분된 그룹 사용자. 최대 길이는 (64KB)
   
  * 타이핑이 두려운 분들을 위하여 아래에 위와 같은 테이블을 생성하기 위한
    스키마를 적는다. 아래의 내용만 파일로 저장한 후, 쉘 상에서
   
    $ mysql < 파일명
   
    해주면 자동으로 생성된다. emoticon*
 
    create database proftp;
    use proftp;
    create table users (
      userid   char(12) not null,
      uid      integer unsigned,
      gid      integer unsigned,
      passwd   char(63),
      shell    char(255),
      homedir  char(255),
      count    integer unsigned not null,
      valid    integer unsigned,
      primary key (userid)
    );
    create table groups (
      gname    char(12) not null,
      gid      integer unsigned,
      members  text,
      primary key(gname)
    );
 
- ProFTPD 환경설정
   패키지도 설치되었고, 데이타베이스도 생성되었다. 이제 남은 일은 ProFTPD의
  환경파일을 편집하고 실제로 동작하는지를 테스트하는 일만 남았다. 자세한
  내용은 ProFTPD 문서 중 README.mod_sql 문서를 참조하기 바란다.
 
  $ vi /etc/proftpd.conf
 
  * SQLConnectInfo        DB명@호스트:포트 아이디 패스워드
    : 위에서 우리는 proftp라는 이름으로 데이타베이스를 생성했으므로, <DB명>에
      'proftp'를 적어준다. <호스트>는 일반적으로 'localhost'를 적어주나, 만약
      다른 서버에 생성하였다면 그 호스트 이름이나 IP를 적는다. <포트>는 기본이
      '3306'이나 포트를 변경하였다면 변경한 포트를 적는다.
      <아이디>는 MySQL에서 proftp 데이타베이스를 사용할 수 있는 사용자 계정 -
      시스템 사용자 계정이 아니다. 잘 모르겠으면 MySQL 문서 중 사용자 관리
      항목을 천천히 읽어본 후 아래를 진행하기 바란다 - 을 입력하고, <패스워드>
      에는... (말 안해도 다 알 것이다 emoticon;emoticon
 
  * SQLUserTable          users
    : 사용자 계정을 관리하는 테이블을 정의한다.
   
  * SQLWhereClause        "valid = 1"
    : 사용자 계정에서 쿼리를 수행할 경우 추가적으로 덧붙일 구문을 적어준다.
      우리는 위에서 'valid'라는 필드를 가지고 있으며, 이 필드는 사용자 계정을
      임시적으로 막거나 해제하기 위해 사용한다고 기술한바 있다.
      여기서는 "valid = 1"이 덧붙여져서 쿼리가 실행되므로, valid 필드만
      0 이나 NULL 로 변경하면 이 계정 사용자는 더이상 로그인 할 수가 없다.
     
  * SQLUsernameField      userid
    : 사용자 계정 필드
   
  * SQLUidField           uid
    : 사용자 계정의 UID
 
  * SQLGidField           gid
    : 사용자가 속한 그룹의 GID
   
  * SQLPasswordField      passwd
    : 계정의 패스워드
   
  * SQLHomedirField       homedir
    : 이 계정의 사용자를 위한 홈 디렉토리. 테이블에서는 시스템의 전체 경로로
      등록하여야 한다. (예: /var/ftp/pub)
     
  * SQLShellField         shell
    : 이 계정의 사용자를 위한 쉘. 테이블에서 이 항목이 비어 있거나 사용할 수 없는
      쉘이 지정되어 있을 경우에는 로그인 되지 않는다. (예: /bin/sh)
     
  * SQLLoginCountField    count
    : 사용자의 누적 로그인 카운트. 이 필드는 ProFTP에 의해서 자동으로 증가한다.
   
  * SQLAuthTypes          Backend
    : 만약 password 필드에 패스워드를 넣기 위해 MySQL 내부 함수 중 PASSWORD()를
      사용하였다면 이와 같이 'Backend'로 지정하고, 일반 텍스트로 입력한 경우에는
      'Plaintext'로 지정한다.
     
  * SQLDoAuth             on
    : SQL 로그인 관리를 할 것인지 말 것인지 지정한다. 이 항목을 off 시키면,
      SQLDoGroupAuth 나 SQLAuthoritative 등 다른 모든 항목을 무효화 시킨다.
 
  * SQLDoGroupAuth        off
    : 그룹 관리를 할 것인지 말 것인지를 지정한다. 이 강좌에서는 그룹 관리를 하지
      않으며 이에 관한 것은 글을 읽는 사람의 몫으로 남겨둔다.
     
  * SQLHomedir            /var/ftp
    : <homedir> 필드가 비어 있을 경우 기본으로 사용할 경로를 지정한다. 여기서는
      /var/ftp 로 되어 있으며, <homedir>가 정의되지 않은 사용자는 /var/ftp로
      로그인 된다.
 - 동작 테스트
 
  ProFTP를 Standalone 방식으로 운용하는 분들은 데몬을 다시 시동한다.
 
  $ /etc/rc.d/init.d/proftpd restart
 
  에러 없이 실행되었다면 환경설정에는 이상이 없다.
  그러나, inetd 방식으로 운용하는 분들이라면 아래와 같이 FTP 서버에 접속한다.
 
  $ ftp localhost
 
  이 때, 접속할 수 없다는 메세지가 나오면 환경설정에 이상이 있는 것이고, 그렇지
  않고 로그인 프롬프트가 보인다면 정상적으로 환경설정이 이루어진 것이다.
 
  * 테스트를 위한 사용자 등록
 
  테스트를 위해서 계정을 하나 등록한다. 계정의 이름은 'myuser' 이며, 이 계정의
  로그인 암호는 'testuser' 이며, 이것은 MySQL에서 인코딩되어 DB에 저장된다.
 
  $ mysql
 
  mysql> u proftp
  mysql> insert into users values (
      ->   'myuser', NULL, NULL, PASSWORD('testuser'),
      ->   '/bin/sh', NULL, 0, 1
      -> );
  mysql> q
 
  이제 다시 FTP로 접속한 후 등록한 계정으로 접속해 본다. 로그인이 되는가?
  만약 로그인이 이루어지지 않는다면 다시 한번 차근차근히 해 보기 바란다.
 
  그리고, 이 허접한 강좌처럼 단순 계정관리가 아닌, UID, GID를 통한 세부관리를
  하는 것은 앞으로 여러분 스스로 개척해 나가야 할 몫으로 남겨둔다.
 ------------------------------------------------------------------------------
   인내심을 가지고 끝까지 읽어주어 진심으로 감사드리며, 마칩니다.
  행복한 나날 되십시요.  꾸벅~~~ (__)(--)
</PRE>
이름
암호
  목록보기 윗글 아랫글
글쓰기
답장쓰기 수정 삭제
정규표현식 [ 상세 검색 ]
페이지로딩: [ 0.89 초 ] 작업시간: [ 0.09 초 ]

Copyleft 1999-2026 by JSBoard Open Project
Theme Designed by IDOO All right reserved
[TOP]

적수네 동네
+
| 적수네 동네
| 공부방
| 리눅스 잡지 서고
| LSN 소스
| 링크 모음
+---+
게시판
+
| 떠들어보세!
| 질문과 답변
| 새소식과 정보
| 1원짜리 팁?
| 대화방
+---+
칼럼?
+
| 세하 훔쳐보기
| Welcome2nite
| 혜진의 염장판
+---+
리눅스 상표권
+
| 반대 서명란
| 토론 게시판
+---+
GNU
+
| GNU 선언문
| GNU GPL
| GNU 미러 목록
+---+
프로젝트?
+
| 리눅스카운터
| RC5DES
| 실질헌법 제작
+---+
커널 소식
+
| 안정 버젼: 2.4.14
+---+
테마 선택
+
LSN 방송국?
+
| OFF AIR
+---+
회원
+
| 로그인
+---+
[ 적수네 동네 ] [ 리눅스 상표권 독점 반대 ] [ 한글 리눅스 문서 프로젝트 ] [ KrLine ] [ 사랑넷 ] [ Valid HTML 4.0! ] [ SlashDot ] [ Freshmeat ]
Copyleft (C) 1998-2001 Byeong-Chan Kim . License
TIME: 1791045277
System by WYZsoft, HDD by I.O.Linux, Mizi Research, Embryo, WOWLINUX, Domain by SarangNet, Network by KrLine.