Kong api gateway 설정 – 2

Kong api gateway 설정 – 2

여기서는 플러그인 활성화 하고 적용 및 테스트 하는 과정을 기록합니다.

첫번째 내용은 여기에..
Kong api gateway 설정 – 1 | 9to5의 개발하면서 겪은 경험

인증 auth


key auth

이제 인증 플러그인을 활성화 시켜보겠습니다.

Plugins – Key Authentication | Kong – Open-Source API Management and Microservice Management

Enable auth plugin on the service

curl -X POST http://localhost:8001/services/mocha/plugins \
  --data "name=key-auth"

Enable auth plugin on the routes

Routes ID 가 필요합니다.
ID 확인이 필요하면,

curl http://localhost:8001/routes

플러그인 활성화

curl -X POST http://localhost:8001/routes/cbaf40b1-196f-4e2b-9b47-b39d84c681a4/plugins \
    --data "name=key-auth" 

Create a Consumer

curl -X POST http://localhost:8001/consumers/ \
  --data "username=admin"

Create a Key

curl -X POST http://localhost:8001/consumers/admin/key-auth

Output:

{"id":"7026e178-9ab7-4bcc-a76a-2ab6b023b84d","created_at":1531989664000,"key":"fqS0sTQ9jM9qjlHNapnzFTJWfI5KGo8P","consumer_id":"69f5420a-6712-4ca2-8bc9-dcc964ebb4e4"}

이제 키 생성이 완료됐습니다.
위에서 등록한 api server 를 다시 호출 해봅시다.

curl -i -X GET \
  --url http://localhost:8000/ \
  --header 'Host: mocha1'

Output:

HTTP/1.1 401 Unauthorized
Date: Thu, 19 Jul 2018 08:43:33 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
WWW-Authenticate: Key realm="kong"
Server: kong/0.13.1

{"message":"No API key found in request"}

이제 plugin 이 enable 되어서 키 없이는 api 가 호출 되지 않습니다.

키를 넣고 다시 호출 합니다.

curl -i -X GET \
  --url http://localhost:8000/ \
  --header 'apikey: fqS0sTQ9jM9qjlHNapnzFTJWfI5KGo8P' \
  --header 'Host: mocha1'

Response code 200 확인 했습니다.

ldap

Plugins – LDAP Authentication | Kong – Open-Source API Management and Microservice Management

curl -X POST http://localhost:8001/routes/cbaf40b1-196f-4e2b-9b47-b39d84c681a4/plugins \
    --data "name=ldap-auth"  \
    --data "config.hide_credentials=true" \
    --data "config.ldap_host=ldap.example.com" \
    --data "config.ldap_port=389" \
    --data "config.start_tls=false" \
    --data "config.base_dn=dc=example,dc=com" \
    --data "config.verify_ldap_host=false" \
    --data "config.attribute=cn" \
    --data "config.cache_ttl=60" \
    --data "config.header_type=ldap

Allow multiple authentication methods per API and/or Consumer · Issue #590 · Kong/kong · GitHub

Kong의 ldap plugin 은 현재까지는 bind_dn을 입력할 수 가 없습니다.

아래 처럼 PR이 들어가 있는거 같긴 한데… 진행되고 있진 않는 듯합니다.
ldap_auth add bind+search feature by daurnimator · Pull Request #3093 · Kong/kong · GitHub

회사 ldap은 거의 bind_dn 을 사용할 것으로 보기 때문에 과감히 버려줍시다…

로그 logging

syslog 나 tcp-log 는 docker 상태에서는 동작하지 않는 것으로 보입니다.

해서, file-log plugin 을 enable해서 사용하는게 가장 간단한 것으로 보입니다.

file-log

file-log를 사용하기 위해서는 nginx 실행시 user 를 root 로 하는 것이 가장 간단 합니다. 아니면 아래의 에러를 보기 쉽상…..

[error] 76#0: [lua] handler.lua:56: [file-log] failed to open the file: Permission denied, context: ngx.timer, client: xxx.xxx.xxx.xxx, server: 0.0.0.0:8000

첫 번째 글에서 kong 을 docker 로 실행할 때 몇 개의 environment variables 이 추가 되어야합니다.

docker run -d --name kong \
    --link kong-database:kong-database \
    -e "KONG_DATABASE=postgres" \
    -e "KONG_PG_HOST=kong-database" \
    -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
    -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
    -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
    -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
    -e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
    -e "KONG_ADMIN_LISTEN_SSL=0.0.0.0:8444" \
    -e "KONG_LOG_LEVEL=info" \
    -e "KONG_NGINX_USER=root" \
    -p 8000:8000 \
    -p 8443:8443 \
    -p 8001:8001 \
    -p 8444:8444 \
    kong:0.14.0-alpine

위 명령대로 다시 kong 을 실행하면 모든 로그가 docker logs 로 리다이렉트 되고, file-log를 활성화 시킬 수 있는 요건을 갖추게 됩니다.

plugin 활성화

  • services
curl -X POST http://localhost:8001/services/c5414169-73f8-4220-881a-0fb09a12973a/plugins \
    --data "name=file-log"  \
    --data "config.path=/dev/stdout"
  • plugins
curl -X POST http://localhost:8001/routes/a57bf14c-4c77-4990-8709-fb94ce006d2b/plugins \
    --data "name=file-log"  \
    --data "config.path=/dev/stdout"

로그 확인

docker logs -f --tail 100 kong

위 명령어로 도커 로그를 확인하면 이제 정상적으로 api 호출시에 로그가 찍히는 것을 확인 할 수 있습니다.

리눅스에서 git ssh접속시 password 입력하지 않기

예전 포스팅에서 git 서버 구축하고 ssh로 접속하는 것 까지 포스팅했었다.

그런데 linux에서 git를 커맨드로 직접 다루려니 비번을 자꾸 물어봐서 너무 스트레스를 받았다.

그래서 ssh를 패스워드 대신 공개키 기반 인증으로 사용하기로 했다.

1. 클라이언트 설정(리눅스)

$ ssh-keygen -t rsa -b 4096 -C "weep@weeppp.com"

본인의 이메일을 입력하고 위 명령 실행하면 키가 생성되는데

첫번째 입력은 key의 이름이고, 두번째는 비밀번호 설정 유무인데, 입력안할꺼면 엔터치면 된다.

git.key  git.key.pub

필자는 git.key라는 이름으로 생성했더니 이렇게 두개의 파일이 생성되었다.

첫번째는 개인키고, 두번째 pub 확장자 파일은 public key, 즉 공개키이다.

두개의 파일을 ~/.ssh 폴더에 위치시킨다. 폴더가 없으면 생성한다.

 

다음으로 ssh-agent 실행유무를 확인하자.

$ eval $(ssh-agent -s)
  Agent pid 2933

위처럼 pid가 나온다면 정상적으로 실행중인 것이다.

$ ssh-add ~/.ssh/git.key

위의 명령이 정상적으로 실행되었다면 이제 password대신 rsa키를 이용해서 ssh접속이 가능해진 것이다.

 

2. 서버 설정

클라이언트의 설정만으로는 물론 서버에 접속이 가능할리가 없다.

클라이언트에서 생성한 공개키를 서버에 복사하자.

여기서는 귀찮으니까 vi를 이용해서 클립보드에 옮겼다.

$ vi ~/.ssh/git.key.pub

cat으로 해도 되고, 파일을 서버로 복사해서 “>>” 명령을 이용해서 append시켜도 되니 취향대로 한다.

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAyKnGRx/DsvDonZQxe4r39XOxlm5BLhx+ksjEubNNq1PWL5Z5XP/96xzf7PwY6C4SXKRc/vnrgqynL4qmcWbU/qXgEqazybTp76egttjRXI7NVKOXeh02pTI67MiEJYRTxcgwP1FS1YerVnBZb79odnAVZZ0utyGU6HZIWgnEk0YL8waygHZFke1PWN+clZedtGDjhO1CfcxmDWmiWWJFtJ/DJHo3nFGP8noQy+Fm/LWSyxwvFqsL6vLi1zftC4NqMfwbvUDNXfaRFjkRdfiq1rgn4Sx/48cs2KhH2utZh5Q21wzFYdEAFAnSlDKtZDmukx/WfcrLkid+yG53Vkv0RmGBe+k1pOaa97X6WFG+7vHhYRY8anQIDie4A56MDfwGRZi0eklxXfVn2dtOKnSXLZxCMucADHJwaT0xE9ANUq7Je+jgoONsCyyDWVpPOMEVF49t4DKbEJux7Ncir0jJ4sid3u4upjar7QNZHnOLEfiOHDoJ2km4+fXizwBqwnPytmkEjbiGuxpQrymQfbcEHsXFjNhRgFTE4u3PYpRyMxaSpE7dHrfH3ZLPSjFtAh39l6Whe2hds3oNr3VwwpRJERzQERhicu6oKHP8s9r2Qlhb4dwYbbLV1Q/TuV1PcMWXUz/Z3SuKelZ9czebkkFhfJXzDDaBNEj4+9i+h1jFXqk= weep@weeppp.com

내가 생성한 공개키이다.

일단 본인의 공개키를 잘 복사해둔다.

 

여기서부터가 진짜 서버설정이다.

서버의 git user 의 홈디렉토리로 이동한다.

$ cd /home/git
$ mkdir .ssh
$ touch .ssh/authorized_keys

git홈에 .ssh 디렉토리를 만들고 공개키들을 저장하는 파일을 만든다.

이때 root로 작업했다면 소유자를 변경해주자.

$ chown -R git.git /home/git/.ssh

authorized_keys에 복사한 공개키를 넣으면 끝.

 

이제 클라이언트에서 git push나 git pull을 해보자

비밀번호를 묻지않으면 성공이다.

 

참고 사이트