반응형

Writer : Jung Sungdong

Reviewed by : 김종호(Jason Kim), 문건기(Geon-gi Mun), 오영택(Youngtaek (Robbie) OH), 오세진(Se Jin OH), 김동한(김동한), 맹윤호

서울대학교 블록체인 학회 ‘디사이퍼(Decipher)’의 Hyperledger Fabric에 대한 글입니다.

Disclaimer: 본 아티클에 대한 리뷰는 전적으로 개인의 차원에서 진행된 것으로 리뷰어의 소속과는 무관합니다.


하이퍼레저는 리눅스 재단(Linux Foundation)이 주도하는 엔터프라이즈용 블록체인 기술 개발을 위한 오픈소스 프로젝트이다. 현재 5개의 프레임워크와 5개의 툴을 만들고 있는 중이며, 이 중에 하이퍼레저 패브릭(이하 패브릭)은 가장 활발하게 개발되고 있다.

패브릭은 모듈화된 프라이빗 블록체인 프로젝트로, 초기 IBM이 제공한 코드를 기반으로 현재 35개 이상의 조직들과 200명이 넘는 개발자가 참여하고 있다. 이렇게 대규모로 개발되고 있는 패브릭은 여러 기업들(구글, 아마존, 오라클 등)이 활용하고 있는 인기 있는 블록체인 프로젝트이다.

패브릭의 네트워크 구조는 비트코인이나 이더리움과 같은 기존에 많이 알려진 퍼블릭 블록체인(Public blockchain)과 비교했을 때 상당히 복잡하다. 이는 패브릭이 프라이빗 블록체인으로서 퍼블릭 블록체인은 가지지 않는(또는 필요 없는) 합의 알고리즘의 선택적 사용, 네트워크 참여 권한 통제, 채널 및 멀티 장부 사용 등의 추가적인 여러 기능들을 가지기 때문이다.

하이퍼레저 패브릭과 다른 블록체인 프로젝트들과의 비교 (2019년 1월 기준)

하이퍼레져 패브릭은 퍼블릭 블록체인들과 비교했을 때, 구조적 차이로 인해 기능상 여러 차이점들이 발생한다. 상세한 구조적 차이를 설명하기 전에 패브릭의 기능적 특징을 우선 간략히 설명하려고 한다. 하이퍼레져 패브릭은 다음과 같은 특징을 가진다.

하이퍼레져 패브릭의 특징

  1. 허가형 블록체인으로서 허가 받은 참여자만 네트워크에 참여할 수 있다.
  2. 스마트 컨트랙트에 일반 프로그래밍 언어 사용이 가능하다. (현재는 go, Node.js 지원)
  3. 스마트 컨트랙트를 일부 노드만 실행하므로 다수의 거래를 병렬적으로 빠르게 처리할 수 있다.
  4. 채널을 이용해 허가 받은 사람들에게만 장부(ledger)를 공개할 수 있다.
  5. 교체 가능한 합의 프로토콜을 사용할 수 있다. (SOLO, Kafka 방식, PBFT등)
  6. 허가형 블록체인으로써 네트워크 참여자의 신원을 확인할 수 있기 때문에 문제 발생시 책임소재를 분명히 할 수 있다.

이 글에서는 하이퍼레저 네트워크를 구성하는 순서대로 차근차근 따라가며 복잡한 패브릭의 구성 요소를 살펴보려고 한다. 이 글을 읽고 독자는 패브릭의 네트워크 구조를 개념적으로 이해하고, 패브릭이 기존의 퍼블릭 블록체인들과 기능적 차이를 가지게 되는 원리를 이해할 수 있게 되기를 바란다.

프라이빗/퍼블릭 블록체인의 개념, 비트코인/이더리움 네트워크 구조에 대해 대략 이해하고 있어야 이어지는 내용을 읽기가 수월할 것으로 예상된다. 패브릭은 현재도 계속 발전되고 있으며, 버전마다 구조가 달라지고 있으므로 최신 자료는 매우 제한적이다. 따라서, 공식 패브릭 홈페이지의 문서를 많이 참조했으며 특히, 블록체인 네트워크 파트의 ‘네트워크 구성 순서’를 안내서로 삼아 이 글을 썼다.

하이퍼레저 패브릭 네트워크 만들기

패브릭 네트워크를 만들기 위해서 가장 먼저 해야할 일은 오더링 서비스(Ordering service)를 구동하는 것이다. 오더링 서비스는 블록 안의 트랜잭션 순서를 정하고 연결된 노드들에게 전달하는 기능을 한다. 트랜잭션의 순서는 FCFS (first-come first-serve) 방식에 의해 결정된다.

오더링 서비스 노드들은 오더링 서비스를 호스팅하는 주체이다. 오더링 서비스 노드들은 한 그룹이 운영하는 중앙화된 방식에서 여러 그룹의 노드들이 참여하는 분산화된 모델까지 여러 합의 방식을 이용할 수 있다. 하이퍼레져 패브릭(Hyperledger Fabric)은 기본적으로 SOLO(Single Ordering Service Node)라는 싱글 노드 방식과 Kafka 방식이라는 CFT(Crash fault tolerance) 기반 합의 프로토콜을 제공한다. 추후 PBFT(Practical Byzantine Fault Tolerance)도 지원할 예정이다. Kafka 방식이 가지는 성질인 CFT(Crash fault tolerance)란 일부 시스템 구성 요소들이 작동하지 않더라도 올바른 합의에 도달할 수 있는 성질을 말한다. 기존 퍼블릭 블록체인에서 주로 사용되는 BFT(Byzantine fault tolerance) 시스템은 시스템 구성요소의 기능적 문제뿐 아니라 악의적인 공격(Malicious attack)까지 고려하므로 CFT 시스템과 비교했을 때 더욱 복잡하며 느리다.

네트워크에 참여하기 위해 특정 주체의 승인(Permission)이 필요하지 않은 퍼블릭 블록체인들과는 달리 프라이빗 블록체인에는 비교적 신뢰할 수 있는 참여자만 관리자의 승인을 받고 네트워크에 참여하게 되므로 악의적인 주체(Malicious actors)의 공격 확률이 매우 작을 것으로 간주한다. 따라서, 프라이빗 블록체인에서는 BFT 기반 합의 프로토콜보다 더 빠르고 간단한 합의 프로토콜 또한 허용 가능한 범위로 간주된다.

패브릭을 사용하는 조직은 지원하는 합의 방식을 사용하거나 직접 구현할 수 있는데, 이렇게 합의 방식을 선택할 수 있는 특성을 패브릭에서는 ‘교체 가능한 합의 프로토콜(Pluggable consensus)을 지원한다’고 한다.

프라이빗 블록체인에서는 어떤 네트워크 참여자가 어떤 권한을 가지는지 관리하는 것이 매우 중요한데, 그룹 별로 네트워크의 자원에 접근할 수 있는 권한은 관리자에 의해 정해져 Network Configuration에 저장된다. 또한, 이를 위해 참여자의 ID와 권한을 관리할 주체가 필요하므로, Certificate Authority(이하 CA)가 필요하다. 간단히 말해 CA는 디지털 증명서(Digital certificate)를 발급하는 기관이다. 패브릭 네트워크에 참여하는 그룹들은 모두 개별 CA를 이용하게 된다.

처음 네트워크를 구성하는 ‘그룹1’이 패브릭 네트워크를 구성한다고 하자. 해야할 일은 다음 순이다.

  1. Ordering service 구동 (Default)
  2. Network Configuration 설정
  3. Certificate Authority 설정

패브릭 네트워크에 다른 조직도 참여하고 네트워크 설정(Network configuration)을 변경할 수 있는 관리자 권한을 받을 수 있다. ‘그룹2’가 네트워크에 참여하고, 네트워크를 설정하는 관리 권한을 ‘그룹1’에게 받고 난 후의 네트워크 구조를 그림으로 나타내면 다음과 같다.

< 그림 1 >

<그림1>의 네트워크에서는 ‘그룹1’과 ‘그룹2’가 네트워크 설정을 변경할 수 있는 같은 권한을 가지며, Kafka 기반 오더링 서비스가 이용된다. Kafka 기반 오더링 서비스는 최소 4개의 노드를 가져야 Crash fault tolerance를 가지므로 4개의 노드를 표시했다. ‘그룹1’은 총 4개의 오더링 서비스 노드들을 운영한다. 현재 오더링 서비스 노드들은 단일 그룹에 속해야 한다. 추후에는 다른 그룹에 속한 노드들끼리도 오더링 서비스를 운영할 수 있도록 업데이트 할 예정이라고 한다.

(실제 Sample network를 구동하는 코드가 궁금하다면, 여기를 참조하기 바란다.)

컨소시엄(Consortium) 구성하기

이 다음으로 패브릭 네트워크를 구성하기 위해 할 일은 컨소시엄(Consortium)을 형성하는 일이다. 컨소시엄의 사전적 정의는 ‘함께 협력하기로 동의한 사람 또는 회사의 집단’이다. 하이퍼레져 패브릭에서는 조직들이 하나의 컨소시엄을 구성하면 그 조직들은 트랜잭션 내역을 공유할 수 있다. 따라서, 하이퍼레져 패브릭안의 컨소시엄은 ‘공동의 목표를 가지고 트랜잭션 내역을 공유하며 협력하는 집단’이라고 볼 수 있겠다. 하나의 네트워크에는 여러 컨소시엄이 존재할 수 있으며 어떤 그룹들이 어떤 컨소시엄을 이루는지는 네트워크 설정 안에 정의된다.

‘그룹3’이 이 네트워크에 참여하고, ‘그룹1’과 ‘그룹3’가 ‘컨소시엄1’을 구성했다고 하자.

이 네트워크를 그림으로 나타내면 다음과 같다.

< 그림 2 >

컨소시엄이 이용하는 채널 만들기

채널(Channel)은 하이퍼레져 패브릭에서 매우 중요한 컨소시엄 내 그룹간 커뮤니케이션 메커니즘이다. 채널은 데이터 분리(data isolation)와 기밀화를 가능케 하며, 채널용 장부(channel-specific ledger)는 채널 사용 허가를 받은 컨소시엄 멤버들만이 접근 가능하다.

네트워크 설정(Network Configuration)과 별개로 채널 설정(Channel configuration)이 존재하여, 채널 설정 정보에는 채널(Channel)에 접근할 수 있는 피어(peer)의 권한 정보등 채널 운영에 필요한 모든 정보를 담고있다. 채널 설정 정보는 블록에 담겨 장부에 기록된다. 채널(Channel)은 네트워크 안에 존재하지만 네트워크 설정(Network configuration)과 채널 설정 사이 중복되는 설정이 없으므로, 네트워크 설정이 변경되어도 채널 설정에 직접적인 영향은 없다. 프라이버시(Privacy)를 유지하며 효율적인 데이터 공유(data sharing)가 가능하게 만들기 때문에 채널은 퍼블릭 블록체인(Public blockchain)은 가지지 못하는 장점을 제공하는 중요한 기능이다. 한 네트워크 안에는 여러 컨소시엄들이 사용하는 채널들이 존재할 수 있다.

  • 장부(Ledger)

블록체인에서 장부란 ‘변경 불가능한 상태 데이터 베이스(immutable state database)’이다. 하이퍼레져 패브릭에서는 한 채널이 한 장부를 가진다. 이 장부를 물리적으로 호스팅 하는 노드들은 피어(Peer)라고 불리며, 한 채널 안의 여러 피어들이 한 장부의 복사본을 가진다. 장부의 업데이트는 여러 피어들의 합의(Consensus)를 통해 이루어지기 때문에 일관성을 유지할 수 있다.

  • 피어(Peer)

피어는 장부(Ledger)를 물리적으로 호스팅하고 Chaincode(하이퍼레져 패브릭의 smart contract)를 저장하고 있는 독립체(entity)이다. 피어는 CA로부터 Identity를 배정 받고 채널에 참여할 수 있다.

다음 순서로 네트워크를 발전시켜 보자.

  1. ‘그룹1’과 ‘그룹3’이 ‘채널1’을 만든다.
  2. ‘채널1’에는 장부도 없고, 이를 호스팅할 피어도 없으므로, ‘그룹1’의 ‘피어1’을 추가하자. 이를 위해서 ‘피어1’은 오더링 서비스에 참여 요청(join request)을 보내야한다. 그러면 오더링 서비스는 ‘채널1’의 설정을 확인하고 ‘피어1’에게 접근 권한을 준다. ‘피어1’이 접근 권한을 받고 나면 ‘피어1’은 ‘채널1’의 ‘장부1’을 호스팅한다.
  3. 같은 방식으로 ‘그룹3’의 ‘피어2’도 참여한다.

이제 이 네트워크를 그림으로 나타내면 다음과 같다.

< 그림 3 >
  • Smart Contract (Chaincode)

스마트 컨트랙트(Smart contract)는 장부에 저장된 상태(state)를 업데이트 하는 코드(code)이다. 하이퍼레져 패브릭에서는 체인코드(Chaincode)라고도 불리며, 패브릭은 체인코드 언어로 현재 Go와 node.js를 지원한다.

하이퍼레져 패브릭에서 체인코드를 사용하려면, 우선 피어 노드에 체인코드가 설치(install)되어야 한다. 피어에 체인코드를 설치하고 나면, 해당 피어는 그 체인코드의 구현 로직(implementation logic)을 담게 된다. 특정 채널을 호스팅 하는 모든 피어들에 같은 체인코드를 설치할 필요는 없으며, 몇 개의 피어들만 선택하여 체인코드를 설치할 수 있다.

하지만, 체인코드가 어떤 피어에 설치했다고 해서 바로 사용할 수 있는 것은 아니다. 그 피어가 호스팅 하는 채널에 연결된 다른 구성 요소들은 어떤 체인코드가 설치됐다는 사실을 알 수 없다. 그러므로 체인코드를 사용하려면 구현 로직이 아닌 해당 체인코드의 인터페이스(코드의 기능에 대한 규약. 코드 구현체는 이 인터페이스에 따라 구현된다.)를 다른 피어들에게 알리는 인스턴트화(Instantiated)가 필요하다. 인스턴트화는 ‘instantiate’ 명령어를 이용하여 이루어질 수 있으며, 샘플 코드는 여기를 참조하기 바란다.

이렇게 체인코드가 피어에 설치되고, 인스턴트화까지 이루어지고 나면 클라이언트 어플리케이션(Client application)에 의해서 체인코드가 호출(invoke)될 수 있다. 클라이언트 어플리케이션은 네트워크 외부에서 체인코드를 호출하고, 결과값을 전송 받을 수 있는 프로그램을 말한다.

일부 노드에만 체인코드의 구현 로직을 설치한다는 점은 기존의 퍼블릭 블록체인(여기서는 주로 이더리움)과 구분되는 차이점이다. 퍼블릭 블록체인에서는 모든 노드가 같은 스마트 컨트랙트(Smart contract)를 실행하고, 상호 검증하게 되므로 사용되는 시스템 구조는 결정적(Deterministic)이어야 했다. 여기서 ‘결정적’의 의미는 데이터베이스가 같을 때는 알고리즘에 어떤 특정 입력 값을 대입하면 항상 같은 출력 값을 출력하는 특성을 말한다. 만약 기존의 퍼블릭 블록체인의 시스템이 결정적이지 않고, 시스템 의존적인 요소를 사용한다면 상호 노드의 출력값이 달라 합의에 이를 수 없다.

또한, 기존의 퍼블릭 블록체인의 시스템에서는 보안을 위해 여러 기능(Network access,I/O stream, File W/R등)이 제한되어야 했다. 따라서, 이더리움이 개발될 때도 이미 여러 훌륭한 프로그래밍 언어가 시중에 존재함에도 굳이 솔리디티(Solidity)라는 스마트 컨트랙트(Smart contract)용 제한적인 언어를 개빈 우드(Gavin wood)가 제안한 것이다. 하지만, 하이퍼레져 패브릭에서는 일부 노드만 체인코드를 실행하고 결과값을 네트워크에 전파하기 때문에 프로그래밍 언어가 꼭 결정적일 필요는 없다. 또, 무한루프등의 문제가 발생해도 영향은 일부 노드로 제한되며, 그 노드는 실행을 종료할 수 있기 때문에 프로그래밍 언어 선택시 퍼블릭 블록체인만큼 엄격할 필요가 없다.

패브릭은 일부 노드에서만 체인코드를 실행하므로 병렬적으로 트랜잭션을 처리할 수 있다는 장점도 있다. 이는 기존의 퍼블릭 블록체인보다 트랜잭션 처리 속도면에서 훨씬 좋은 성능을 낼 수 있게 만든다. 그렇다고 어떤 노드에서 실행한 체인코드의 결과값을 다른 노드가 전혀 검증하지 않는 것은 아니다. 이 결과값은 여러 노드에 의해 검증될 수 있으며, 그 방법은 해당 체인코드의 보증 정책(Endorsing policies)에 따라 결정이 된다. 보증 정책이란 어떤 체인코드가 장부를 업데이트하기 위해 몇 개의 서명(sign)이 필요한지를 명시해 놓은 조건이다. 예를 들어, 체인코드A는 멤버1과 멤버2 둘의 서명이 모두 필요하다고 할 때, 체인코드A를 실행하면 멤버1과 멤버2에게 모두 요청이 간다. 그러면 요청이 문제가 없는지 멤버1,2는 확인하고 체인코드를 실행한 후, 두 값이 같은 때만 장부(ledger)를 업데이트한다.

< 그림 4 > (출처 링크)

다음 순서로 초기 네트워크를 완성하자.

  1. ‘피어1’에 ‘체인코드1’을 설치한다.
  2. ‘피어2’에 ‘체인코드1’를 설치한다. (피어1의 체인코드에 사용된 언어와 다른 프로그래밍 언어를 써도 된다. 결과값만 똑같이 출력하면 된다.)
  3. ‘체인코드1’을 인스턴트화(instantiate)한다.

초기 네트워크 구성 완료

구성이 완료된 간단한 네트워크의 모습을 그림으로 나타내면 다음과 같다.

< 그림 5 >

이 네트워크를 구성하는 요소를 정리해보면 다음과 같다.

  • 그룹 또는 조직(Group or organization)
  • 오더링 서비스 노드들 (Ordering service nodes)
  • CA(Certificate Authority)
  • 컨소시엄(Consortium)
  • 채널(Channel)
  • 채널 설정(Channel configuration)
  • 장부(Ledger)
  • 피어(Peer)
  • 클라이언트 어플리케이션(Client application)

위의 요소들은 모두 하나 또는 여러 개가 네트워크에 존재할 수 있으며, 각 요소들은 추가되어 네트워크를 확장할 수 있다. 이렇게 구성된 네트워크에서 트랜잭션을 처리해보면서, 패브릭 네트워크가 어떻게 동작되는지 살펴보자.

트랜잭션 처리 과정

하이퍼레져 패브릭에서는 아래와 같은 순으로 트랜잭션이 일어난다.

  1. 클라이언트 어플리케이션에서 SDK를 통해 트랜잭션 제안(transaction proposal)을 발생시킨다.
  2. 체인코드의 보증 정책(endorsing policy)에 명시된 노드들(endorsing peers)은 체인코드를 실행한다.
  3. 각 결과값은 클라이언트 어플리케이션에 전달된다.
  4. 결과값이 보증 정책을 만족시키면, 결과값은 오더링 서비스(ordering service)에 전달된다.
  5. 오더링 서비스는 먼저 도착한 순으로 블록을 만들어 채널의 모든 피어들에게 전달한다.
  6. 모든 피어는 도착한 블록이 보증 정책을 만족시키는지, 장부 상태(ledger state)가 트랜잭션이 일어나는 동안 바뀌지 않았는지 확인한다.
  7. 각 피어들은 블록을 채널의 체인에 덧붙이며, 장부의 상태를 업데이트 한다.

여기까지 하이퍼레져 패브릭의 초기 네트워크를 간단히 구성하고, 트랜잭션이 어떻게 발생하는지 알아보았다. 이 글을 통해 패브릭 네트워크 구조에 대한 기본 개념을 이해하고, 패브릭은 어떤 특징들을 가지는지 이해할 수 있었기를 바란다. 이 글에서 퍼블릭 블록체인과 프라이빗 블록체인인 패브릭을 비교하며 서술을 많이 했지만, 어느 쪽이 더 낫다고 말하기 위해 쓴 글은 아니다. 두 블록체인은 쓰임새가 다르며, 장단점이 다르기 때문이다. 앞으로 각 분야에서 필요한 곳에 퍼블릭 블록체인과 프라이빗 블록체인이 적절히 사용되길 기대한다.

작성자 이메일 : universale0723@gmail.com



반응형
반응형

출처: https://zetawiki.com/wiki/CentOS_php-mcrypt_%EC%84%A4%EC%B9%98


Red Hat, CentOS 6에서 테스트하였습니다.
how to install php-mcrypt on CentOS 6
PHP Mcrypt on CentOS 6
The mcrypt extension is missing. Please check your PHP configuration.
php-mcrypt 설치

1 문제상황 1: phpMyAdmin[편집]

phpMyAdmin에서 아래와 같은 경고 메시지가 나온다.

The mcrypt extension is missing. Please check your PHP configuration.

php-mcrypt 모듈이 없어서 그렇다.

2 문제상황 2: php[편집]

PHP에서 mcrypt 함수를 사용하고 싶은데 안된다.

Fatal error: Call to undefined function mcrypt_create_iv()

3 확인[편집]

[root@zetawiki ~]# php -r "mcrypt_create_iv();"
PHP Fatal error:  Call to undefined function mcrypt_create_iv() in Command line code on line 1

Fatal error: Call to undefined function mcrypt_create_iv() in Command line code on line 1
→ mcrypt_create_iv 함수를 인식하지 못한다.
[root@zetawiki ~]# php -m | grep mcrypt
[root@zetawiki ~]# rpm -qa | grep mcrypt
[root@zetawiki ~]#
→ 설치 안됨.
[root@zetawiki ~]# yum list php-mcrypt
... (생략)
Error: No matching Packages to list
→ CentOS 기본 yum 저장소에는 없음

4 epel-release 설치[편집]

16px-Crystal_Clear_app_xmag.svg.png epel-release 설치 문서를 참고하십시오.

5 php-mcypt 설치[편집]

[root@zetawiki ~]# yum install php-mcrypt
... (생략)
==================================================================================================================
 Package                      Arch                     Version                       Repository              Size
==================================================================================================================
Installing:
 php-mcrypt                   x86_64                   5.3.3-1.el6                   epel                    18 k
Installing for dependencies:
 libmcrypt                    x86_64                   2.5.8-9.el6                   epel                    96 k

Transaction Summary
==================================================================================================================
Install       2 Package(s)

Total download size: 114 k
Installed size: 326 k
Is this ok [y/N]: y
... (생략)
Installed:
  php-mcrypt.x86_64 0:5.3.3-1.el6                                                                                 

Dependency Installed:
  libmcrypt.x86_64 0:2.5.8-9.el6                                                                                  

Complete!

6 확인 2[편집]

[root@zetawiki ~]# php -m | grep mcrypt
mcrypt
[root@zetawiki ~]# rpm -qa | grep mcrypt
php-mcrypt-5.3.3-1.el6.x86_64
libmcrypt-2.5.8-9.el6.x86_64
[root@zetawiki ~]# php -r "mcrypt_create_iv();"
PHP Warning:  mcrypt_create_iv() expects at least 1 parameter, 0 given in Command line code on line 1

Warning: mcrypt_create_iv() expects at least 1 parameter, 0 given in Command line code on line 1
→ mcrypt_create_iv 함수가 인식되었다.

7 아파치 재시작[편집]

  • 웹에도 적용되게 하기 위해서는 httpd를 재시작해야 한다.
[root@zetawiki ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
  • 이제 phpMyAdmin에서도 경고 메시지가 사라졌을 것이다.

8 같이 보기[편집]

9 참고[편집]


반응형
반응형

출처: https://levin01.tistory.com/1624


1. Proftp 소개  


1. Proftp 소개
Proftpd는 파일전송 프로토콜인 FTP의 일종으로서 보안적이고 신뢰적인 FTP서버가 되기를
희망하며 발전을 하며 Apache 설정파일과 같은 설정 방식을 따른다.
Proftpd는 다음 기능을 제공한다.
☞ Apache 웹 서버를 사용해 본 관리자라면 누구나 직관적으로 이해할 수 있는 지시자와
  지시그룹으로 된 단 하나의 설정 화일.
☞ Apache의 ".htaccess"와 비슷한 각 디렉토리의 ".ftpaccess" 설정.
☞ 쉽게 설정할 수 있는 다중 가상 FTP 서버와 anonymous FTP 서비스.
☞ 시스템 부하에 따라 stand-alone 또는 inetd 중에서 골라서 운영되도록 만들어짐.
☞ anonymous FTP의 root 디렉토리에는 특별한 디렉토리 구조나 시스템 화일이 없어도 됨.
☞ SITE EXEC 명령이 없다. 현대의 인터넷 환경에서 그런 명령은 보안면에서 악몽이다.
  ProFTPD는 어떠한 경우에도 어떤 외부 명령도 실행하지 않는다. 검사를 위해 관리자에게
  소스가 제공된다 (항상 제공될 것이다).
☞ 유닉스 스타일 퍼미션에 기초한 숨겨지는 디렉토리나 화일들 또는 유저/그룹 소유권.
☞ "root" 권한을 따낼 수 있는 공격의 기회를 줄이기 위해 stand-alone 모드에서는 특권이
없는 유저도 운영을 할 수 있도록 설정가능. 주의: 이 기능은 Unix 시스템의 능력에 기초한다.
☞ 기록하기, utmp/wtmp 지원. 기록하기는 wu-ftpd 표준과 호환이며 확장된 기록하기도 가능하다.
☞ shadow 암호 지원, 만료된 계정들 지원 포함.
                                                             <자료출처 : proftpd.oops.org>


2. Proftp 설치파일 확인  


1. 패키지 확인 및 파일설명
]# rpm -qa | grep proftp [Enter]
proftpd-1.2.1-2wl

]# rpm -ql proftpd-1.2.1-2wl  [Enter]
/etc/pam.d/ftp  #ftp사용자 인증할때 사용한다.
/etc/proftpd/conf/ftpusers # ftp접속을 제한하는 사용자를 등록한다.
/etc/proftpd/conf/proftpd.conf #ftp설정파일이다.
/etc/proftpd/conf/proftpd.xinetd #ftp를 xinetd에 넣을때 사용되는 파일이다.
/etc/proftpd/document
/etc/rc.d/init.d/proftpd   #proftpd 대몬파일이다.
/usr/sbin/ftpshut    # proftp대몬을 죽일때 사용한다.
/usr/sbin/in.ftpd
/usr/sbin/in.proftpd  # xinetd에 넣을때 사용되는 대몬
/usr/sbin/proftpd
/usr/sbin/xferstats  #ftp상태를 보여준다.
.............
/var/ftp/incoming   # 디렉토리생성
/var/ftp/pub        # 디렉토리생성
/var/run/proftpd    # 디렉토리생성




3 Proftpd.conf  


1. 설정 파일 분석
]# cat /etc/proftpd/conf/proftpd.conf [Enter]
# ProFTPD configuration file. Need more information of configuration,
# See the References in '/usr/share/doc/proftpd-core-{version}/' directory
# If u have any question, visit our Web Site.http://www.wowlinux.com
# orhttp://proftpd.oops.org
# Thank you - WOWLINUX.COM


#########################
#    Global start       #    ## Global Section
#########################

ServerName "canux.pe.kr FTP Server"
# ftp서버네임을 지정해준다.

ServerType standalone
# 서버타입을 적어주는 곳으로 standalone,xinetd두가지 방법이 있습니다.

DefaultServer on
# ftp서버가 여러개일경우 기본ftp로 설정하는 부분이다.

Port 21
# ftp가 사용할 포트

Umask 022
# 파일생성시 퍼미션 지정

MaxInstances 30
# 최대 자식프로세스 수 지정

User nobody
# ftp가 실행되는 사용자명을 지정한다.

Group nobody
# ftp가 실행되는 그룹명을 지정한다.

DefaultRoot                  ~
# 계정사용자가 ftp로긴시 홈디렉토리외의 상위디렉토리 접근금지

UseReverseDNS off
# 호스트 이름으로 기록할 건지를 설정

ServerAdmincanux@canux.pe.kr
# 서버관리자메일주소지정한다. 문제발생시 관리자한테 메일을 발송한다.

IdentLookups off

AuthPAMAuthoritative on
# ftpusers를 사용하여 인증여부 설정

RootLogin off
# root관리자 로긴허용 여부 설정 만약 허용하고 싶을때는 ftpusers파일에서 root 각주처리

DenyFilter \*.*/
# 특수문자에 대해서 거부설정

DeferWelcome off
# 인증전 서버 이름이 화면에 뿌려지는 것인지 허용여부

TimesGMT off
# 타임아웃을 설정안함

#RateReadBPS 256
# 초당 전송 대역폭(BPS)

#RateReadFreeBytes 5120
#RateReadHardBPS on

TimeoutIdle 0
# client에서 아무런 작업을 하지 않을때 연결을 끊는 것을설정 0이면 연결제한을 안한다

TimeoutNoTransfer 0
# TimeoutIdle,TimeoutNoTransfer는 User가 접속 후 아무 작업도 하지 않을 경우 접속 종료 시간 설정

TimeoutLogin 300
# client가 인증을 유지할수 있는 시간을 초단위로 지정

DisplayLogin /etc/proftpd/conf/welcome.msg
# 로그인시 뿌려지는 메세지의 경로

DisplayFirstChdir .message
# 각 디렉토리별로 접근시 뿌려지는 메세지 파일 이름

<Directory /*>
 AllowOverwrite on
 # ftp / 디렉토리내에서 같은 이름의 파일이 전송받을때 덮어쓰기를 허용할지 거부할지 설정
</Directory*>

#########################
#    Global   END       #
#########################

#########################
#   Anonymous   start   #    ## Anonymous Section
#########################

<Anonymous ~ftp>

 User ftp
 #Anonymous로 접속할경우 사용자를 ftp로 인식한다.
 
 Group ftp
 #Anonymous로 접속할경우 그룹명을 ftp로 인식한다.

 UserAlias anonymous ftp
 #Anonymous접속한 사죵자의 접속자명을 ftp로 별칭
 
 MaxClients 10 "Sorry, maxium users %m -- try again later"
 #동시접속자수를 제한하는것으로 10이 초과시 " "안의 메시지를 출력한다.
 
 MaxClientsPerHost 2 "Sorry, Over 2 connection not allow"
 #한 호스트당 접속할수있는 최대 사용자수로 초과시 " "안의 메시지를 출력한다.
 
 DisplayLogin welcome.msg
 # ftp로 로긴할때 출력해지는 파일지정
 
 DisplayFirstChdir .message
 # 각 디렉토리별로 접근시 뿌려지는 메세지 파일 이름
 
 RequireValidShell off
 # Anonymous로 접속가능하게 할려면 off로 설정

#  HideUser root
# 지정한 사용자권한의 화일을 안보이도록 설정

#  HideGroup root
# 지정한 그룹권한의 화일을 안보이도록 설정

# Anonymous/'s Uploads Directory
 <Directory incoming/*>
   AllowOverwrite on
   # 같은이름의 파일을 덮어쓰기를 설정
   
   AllowRetrieveRestart on
   # FTP REST 명령을 통하여 file을 재전송 하는 것을 허용
   
   AllowStoreRestart on
   # client로 부터 server로 보내지는 store file 전송을 client가 "restarting" 하는 것을 허락하거나 거부
   
   <Limit DELE RMD>
   # 디렉토리삭제,삭제에 대한설정
   
     DenyAll
     # 디렉토리삭제,삭제에 전부 거부한다.
     
   </Limit>
   <Limit READ STOR MDK>
   # 읽기,저장디렉토리생성에 대한 설정
   
     AllowAll
     # 읽기,저장,디렉토리생성을 허락한다.
     
   </Limit>
   
   <Limit LOGIN>
   # 사용자로긴에 관한 설정
   
   Order deny, allow

   Deny from 203.249.73.2, 211.203.178.5, 211.112.37., .deny.com
   # 위의 아이피나 도메인명에서는 접속을 거부한다.

   Allow from all
   # 위의 거부목록을 제외한 나머지 머신에서는 접속이 가능하다.

   </Limit>
   
 </Directory>

# Anonymous\'s Public Directory
 <Directory pub/*>
 # pub/*아래파일에 대한 설정
 
   <Limit READ>
   # 읽기권한에 대한 설정
   
     AllowAll
     # 읽기권한 허락한다.
     
   </Limit>
   <Limit STOR DELE RMD MKD>
   # 저장,삭제,디렉토리생성,삭제에 대한 설정
   
     DenyAll
     # 저장,삭제,디렉토리생성,삭제를 거부한다.
   </Limit>
 </Directory>

</Anonymous>
#########################
#   Anonymous    end    #    ## Anonymous Section
#########################


4. /etc/proftpd/conf/welcome.msg  


1. welcome.msg설정
ftp사용자가 접속했을때 보여주는 메세지내용이다.
]# cat /etc/proftpd/conf/welcome.msg
ftp://%L/
Available Disk Space : %F
Now Login Users : %N/%M
Remote Host : %R Remote User : %u
Uptime : %T
Admin-Mail : %E

ftp접속후 나온결과
ftp://canux.pe.kr/
Available Disk Space : 408516
Now Login Users : 1/unlimited
Remote Host : 127.0.0.1 Remote User : UNKNOWN
Uptime : Wed Mar 27 05:55:03 2002
Admin-Mail :canux@canux.pe.kr


여기서 쓰이는 변수는 다음과 같은 뜻을 나타냅니다.
변수 설명
%L 서버명
%u 접속 계정명
%F 남은 용량
%T 접속 시간
%N 현 사용자
%E 관리자 e-mail
%M 최대 사용자
&C 현재 디렉토리
%R 리모트 호스트명


5. Xinetd Deamon 합류  


1. xinetd에 끼워넣기
rpm버젼을 설치했을경우 /etc/xinetd.d/에 proftpd설정파일은 /etc/proftpd/conf/proftpd.xinetd파일이다.
이파일을 이름을 proftpd로 바꾸어서 복사하면 된다.
만약 화일이 없다면 패키지 검사를 해보면된다.
]# rpm -ql proftpd | grep proftpd.xinetd [Enter]
/etc/proftpd/conf/proftpd.xinetd

]# service proftpd stop [Enter]
Shutting down proftpd: No way to suspend [  OK  ]

]# cat /etc/proftpd/conf/proftpd.conf | grep ServerType [Enter]
ServerType                      inetd    # 7.x대라고 xinetd를 적어주면 안된다.

]# vi /etc/xinetd.d/proftpd [Enter]
service ftp
{
       disable                 = no    #사용가능하도록 no로 설정
flags                   = REUSE
       protocol                = tcp
       socket_type             = stream
       instances               = 50
wait                    = no
       user                    = root
       server                  = /usr/sbin/in.proftpd
       log_on_success          = HOST PID
       log_on_failure          = HOST RECORD
nice = 10
}
위에서 바꿀내용은 사용여부만을 바꾸어주면 된다. 만약 소스로 설치했다면 server의 대몬경로를 수정해야 한다.

]# service xinetd restart [Enter]
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]

]# ftp 0 [Enter]
Connected to 0.
220 BCB1COOL Server (Proftpd FTP Server) [test.ilinuxbay.com]
500 AUTH not understood.
500 AUTH not understood.
KERBEROS_V4 rejected as an authentication type
Name (0:root): canux
331 Password required for canux.
Password:
230-ftp://test.ilinuxbay.com/
Available Disk Space : 408508
Now Login Users : 1/unlimited
Remote Host : 127.0.0.1 Remote User : UNKNOWN
Uptime : Wed Mar 27 14:05:51 2002
Admin-Mail :canux@canux.pe.kr
230 User canux logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
21 Goodbye
]#


6. ftp 관련 명령어  


1. proftp관련 명령어
- ftpusers
ftp접근사용자를 제한하는것으로 이파일안에 있는사용자는 ftp를 사용할수 없다.
]  # cat /etc/pam.d/ftp [Enter]
 auth       required     /lib/security/pam_listfile.so item=user sense=deny \
                         file=/etc/proftpd/conf/ftpusers onerr=succeed

 ]# cat /etc/proftpd/conf/ftpusers [Enter]
 # ftp로긴을 거부하는 사용자 목록
 root
 bin
 daemon
 adm
 lp
 sync
 shutdown
 halt
 mail
 news
 uucp
 operator
 games
 nobody
 gdm
 mysql
 canux
 ]#

- ftpshut
 지정한 시간에 모든 proftd server들을 shutdown 한다. 이 명령은 자동으로 shtudown 진행을
 준비하고, 자동으로 현재 proftpd connection을 끊을 수 있으며, 새로운 연결을 거부하도록
 할 수 있다. 명령은 suhtdown이 임박함을 proftpd process에 알리기 위하여 /etc/shutmsg와
 같은 control file을 이용하여 사용할 수 있다.

ftpshut [ -l min ] [ -d min ] time [ warning-message ]

 옵션 설명
 time time은 ftp server를 down시킬 시간을 말한다. now'라는 단어는 즉시 shutdown을
 지시하며 +number 또는 HHMM. 이라는 두 개의 형식 중 하나는 미래의 시간에 shut down을 지시한다.
 첫번째 형식은 number 분 후에 server를 down 하며 두번째 지시자는 하루 중 정확한 시간을
 지시하며 24시간 clock 형식을 사용한다. (예 오후3시 30분 : 1530 )

 -l min shutdown 전에 새로운 ftp access를 거부하는 것을 분단위의 숫자로 지정한다.
 만약 -l 옵션을 지정하지 않으면, 기본으로 10분이 적용된다.
 (만약 shutdown 까지 10분이 채 남지 않는다면 즉시 적용된다.)

 -d min shutdown 전에 현재 ftp connection들을 종료하는 것을 분 단위의 숫자로 지정한다.
 -d 옵션을 지정하지 않으면 기본으로 5분이 적용된다. shutdown이 5분 이내로 남았다면 즉시
 접속이 종료된다.


 warning-message(경고 메세지)

 새로운 접속을 거부하거나 현재 연결되어 있는 session을 종료시킬 때 부가적으로 메세지를
 준비할 수 있다. 메시지는 아래와 같은 변수를 이용해서 작성할 수 있다.

 %s proftpd가 종료하는 시간

 %r 새로운 접속이 거부되기 시작하는 시간

 %d 현재 접속이 종료되는 시간

 %C 현재 작업중인 directory (where applicable)

 %L local host name (of virtualhost name)

 %R remote host name

 %T local time (형식 : Thu Nov 15 17:12:42 1990)

 %U login time 시에 주어진 username

 ]# ftpshut -l 5 -d 5 /etc/proftpd/conf/warn.conf  [Enter]

반응형
반응형

분  시  일 월 요일 명령
10   *   *  *   *     echo 'Hello'

 
설명
   분: 0~59
   시: 0~23
   일: 1~31
   요일: 0~6 (0: 일요일, 6: 토요일)


1분단위의 경우

*/1 * * * * 명령어

이렇게 하면 1분단위가 되는데 30초 단위로 명령이 실행되고자 한다면 sleep 을 이용하면 된다.

* * * * * * 명령어 & sleep 30; 명령어

이렇게 하면 명령어가 실행된뒤 30초간 sleep 한뒤 다시 명령어를 실행 그렇게 계속 반복하도록 하는 것이다.

물론 수정후 데몬을 재시작 해주셔야겠죠
/etc/init.d/crond restart


예시 : 5초단위로 task라는 job을 돌여야 하는 경우

* * * * * ~/dostuff.sh

dostuff.sh:

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

 

 

 

 1분을 12회 실행 - 5초간격

/root/5seconds.sh & sleep 5

*/1 * * * * root cat /dev/null > /root/5seconds.txt; /root/5seconds.sh & sleep 5; /root/5seconds.sh & sleep 5; /root/5seconds.sh & sleep 5; /root/5seconds.sh & sleep 5; /root/5seconds.sh & sleep 5; /root/5seconds.sh & sleep 5; /root/5seconds.sh & sleep 5; /root/5seconds.sh & sleep 5; /root/5seconds.sh & sleep 5; /root/5seconds.sh & sleep 5; /root/5seconds.sh & sleep 5; /root/5seconds.sh & sleep 5 

 

//1초 마다 실행

(sleep 1   && wget -O - -q -t 1 http://219.240.39.221/sm_dev/myinc/cron/chk_Sentinel.php) &
(sleep 2   && wget -O - -q -t 1 http://219.240.39.221/sm_dev/myinc/cron/chk_Sentinel.php) &
(sleep 3   && wget -O - -q -t 1 http://219.240.39.221/sm_dev/myinc/cron/chk_Sentinel.php) &
(sleep 4   && wget -O - -q -t 1 http://219.240.39.221/sm_dev/myinc/cron/chk_Sentinel.php) &
(sleep 5   && wget -O - -q -t 1 http://219.240.39.221/sm_dev/myinc/cron/chk_Sentinel.php) &
(sleep 6   && wget -O - -q -t 1 http://219.240.39.221/sm_dev/myinc/cron/chk_Sentinel.php) &

.....

(sleep 60   && wget -O - -q -t 1 http://219.240.39.221/sm_dev/myinc/cron/chk_Sentinel.php) &


파라메터

wget -q --post-data 'pwd=adc123' http://219.240.39.221/sm_dev/myinc/cron/chk_Sentinel.php > /dev/null 2>&1 


- '*' 표시는 해당 필드의 모든 시간을 의미한다.

-  3,5,7 와 같이 콤마(,)로 구분하여 여러 시간대를 지정할 수 있다.
     ex) 10 1,5,7 * * * echo 'Hello'

     매일 1시 10분, 5시 10분, 7시 10분에 실행된다.

-  2-10와 같이 하이픈(-)으로 시간 범위도 지정할 수 있다. 
    ex) 10 1-7 * * * echo 'Hello'

    매일 1시부터 7시까지 매시 10분에(7시 10분 포함)에 실행된다.

-  2-10/3와 같이 하이픈(-)으로 시간 범위를 슬래쉬(/)로 시간 간격을 지정할 수 있다.

    ex) 1-59/3 1-7 * * * echo 'Hello'

    매일 1시부터 7시까지 1분, 4분(1+3), 7분(1+3+3) ... 58분까지 3분간격으로 실행된다.

[출처] Cron으로 초 단위 실행|작성자 yes


반응형

+ Recent posts