'IT·컴퓨터'에 해당되는 글 16건

  1. 2008.10.27 SSH 접속 시 공개키를 사용하여 접속하기
  2. 2008.10.27 MySQL에서 Query Cache 사용하기
  3. 2008.10.27 [Javascript] setTimeout() / setInterval() 메소드
2008.10.27 09:23

SSH 접속 시 공개키를 사용하여 접속하기

이미지도 함께 보려면 : http://blog.naver.com/choibit/140054432679


리눅스의 OpenSSH는 신뢰성있는 원격 접속을 지원해 준다. SFTP를 사용할 수 있도록 해주며, 암호화 통신을 할 수 있다. 이런 SSH는 더욱 강력한 접속 기능을 가지고 있는데 바로 공개키를 이용한 접속이다.

 

즉 서버에는 공개키가, 클라이언트는 개인키를 가지고 있어야지만 SSH접속을 할 수 있도록 할 수 있다.

 

이 접속을 하기 위해서는 리눅스 서버에 OpenSSH가 설치되어 있어야 한다.

그리고 키생성 및 SFTP접속을 위해서 비트바이즈의 터널레이어를 이용하도록 하겠다.

 

터널레이어는 http://www.bitvise.com에서 최신버전을 다운로드 받을 수 있다.

무료이며, 프리소프트웨어이다.

 

1. SSH설정하기

 

서버의 SSH를 설정해보자. yum을 이용하여 openSSH를 설치한 경우나, 리눅스 설치시 설치된 경우,

/etc/ssh 폴더로 ssh설정 파일이 들어가 있다.

컴파일을 통한 설치시 별도 설정파일 저장을 설정한다면, 설정파일이 있는 곳을 확인하면 될 것이다.

 

다른 파일을 건들일 필요는 없다. 설정파일에 sshd_config 파일을 불러 온다.

 

     20 # HostKey for protocol version 1
     21 #HostKey /etc/ssh/ssh_host_key
     22 # HostKeys for protocol version 2
     23 HostKey /etc/ssh/ssh_host_rsa_key
     24 HostKey /etc/ssh/ssh_host_dsa_key

 

23번 24번줄에 # 되어 있는 부분을 삭제해 준다. 공개키로 접속을 허용한다는 이야기다.

 

     43 RSAAuthentication yes
     44 PubkeyAuthentication yes
     45 AuthorizedKeysFile      .ssh/authorized_keys

 

43번, 44번, 45번 줄의 #을 없에준다.

 

RSAAuthentication를 사용하며, PubkeyAuthentication를 사용한다는 뜻이다.

AuthorizedKeysFile는 공개키의 위치를 알려주는 것이다. 각 유저의 .ssh폴더 아래에 authorized_keys라는 파일 이름으로 공개키를 저장한다는 이야기이다.

 

     60 PasswordAuthentication yes

 

60번 줄에는 다음과 같은 설정이 있다. 이 설정은 비밀번호를 이용하여 SSH를 로그인 한다는 이야기이다. 일단 yes로 해놓자. 사실 no로 하여 공개키를 이용한 접속만 허용해야 하나, 설정이 완료된 후 접속이 되는지 안되는지 확인한 후에 설정을 바꾸어 주는것이 좋다. 왜냐하면 잘못 설정한 후 접속이 끊겨 버리면 서버에 직접 가서 설정을 해줘야 하기 때문이다. 꼭 기억하자. 비밀번호를 이용한 접근은 완벽한 보안을 가져올 수 없다. 나중에 꼭 no로 변경하도록 하자.  

 

저장을 하고 빠져나오자.

 

[root@Belief ssh]# service sshd restart

 

sshd를 재시작 해준다.

 

2. 공개키, 개인키 만들기

 

이번에는 공개키와 개인키를 만들어 보자. 키 매니저로 서버에서 만들 수 있지만,편리하게 Tunnelier 를 이용하여 설정해 보자.

이것을 이용하여 SFTP를 연결해 사용할 수도 있다.

 

http://www.bitvise.com/download-area에 가서 Tunnelier installer를 다운받은 후 설치한다.

 

설치가 완료되면 Tunnelier를 실행해 보자. 그 다음 User Keypair manager를 클릭한다.

 

 

클릭 후 Generate New를 클릭해 보자.

 

 

 그럼 왼쪽과 같은 창이 뜬다.

창에서 Passphrase에 인증서 비밀번호를 설정할 수 있다. 비밀번호를 설정하고 싶으면 입력하면 되고, 설정을 하고 싶지 않으면  그 상태에서 아래의 Generate 버튼을 눌러 설정할 수 있다.

 

 당연한 이야기이지만 인증서 비밀번호 설정시 확인 비밀번호도 넣고, 일치해야 키가 생성된다.

 

 

 

 

 

 

 

 

 

 

 

 

그럼 아래와 같이 키가 생성된것을 확인할 수 있다. .

 

 

 그럼 생성된 키를 가지고 공개키와 개인키를 생성해 낼 수 있다. Exprot 버튼을 눌러보자.  

 

 Exprot public key로 공개키를 저장할 수 있다. 확장자는 .pub로 저장할 수 있으며, 확장자 자체는 큰 문제가 되지 않는다. 리눅스의 경우 OpenSSH 포멧으로 설정을 하면 된다. 또한 SSH2를  직접 설치한 경우라면 SSH2포멧으로 저장을 하면 된다.

 

 Exprot private key로 개인키를 저장할 수 있다. 어떠한 포멧이든 상관 없다. Secure CRT를 이용하여 리눅스의 OpenSSH에 접근하고자 한다면 OpenSSH format로 설정하여 저장하면 된다. 이때 확장자는 다르되, 파일 이름은 동일하게 해줘야 한다.

 

 

 

 

 

 

그럼 공개키 및 개인키를 생성하였다. 그 다음에는 서버에 공개키를 설정해 보도록 하자.

 

3. 서버에 공개키 설정

 

 위 sshd_conf 설정에서도 보았듯이,(45 AuthorizedKeysFile      .ssh/authorized_keys 를 이야기 한다.) 각 유저의 홈디랙토리에 .ssh라는 디랙토리를 생성한다.

 

[charmhcs@Belief ~]$ mkdir .ssh

 

그 후 퍼미션을 설정해 줘야 한다. 중요하다. 퍼미션이 맞지 않으면 로그인을 할 수 없게 되어 있다.

 

[charmhcs@Belief ~]$ chmod 755 .ssh

 

그 후 .ssh폴더에 *.pub키를 업로드 한다. 그리고 빈 파일의 authorized_keys 라는 파일을 생성한다.

 

[charmhcs@Belief ~]$touch authorized_keys

[charmhcs@Belief ~]$cat charmhcs.pub >>authorized_keys

 

그 후 퍼미션을 조정해 준다.

[charmhcs@Belief ~]$ chmod 644 authorized_keys

 

여기서도 퍼미션이 맞지 않으면 접속을 할 수 없다.

 

여기서 하나의 계정을 여러명의 키로접근할 수도 있다. 계정 홈디랙토리아래  .ssh에 공개키를 업로드한 후

 

[charmhcs@Belief ~]$cat bestvip.pub >>authorized_keys

를 한다면 authorized_keys에는 charmhcs.pub 와 bestvip.pub 정보를 모두 가지게 되며, 두개의 키로 하나의 계정에 접근할 수 있게 된다. 예를들어 한 계정에 여러명의 개발자가 접근하길 원한다면 위에 처럼 설정을 해주면 여러명의 개발자가 접근할 수 있게 된다.

 

4. 원격 접속 프로그램 연결

 

 그럼 설정이 모두 끝났다. SSH접속 프로그램 SecureCRT같은 프로그램.. 을 이용하여 접속을 해보자.

접속을 하기 위해서 공개키 접속설정을 해줘야 한다. 개인키와 공개키 모두를 등록한 후 접속을 해보자. 그럼 별도의 로그인 작업 없이 키를 통해서 서버에 접속할 수 있다. (이때 공개키에 비밀번호를 걸어 놓았으면, 비밀번호를 입력해 줘야 동작을 한다.)

 

 또한 Tunnelier를 이용하여 접속도 가능하다. 키를 생성했기 때문에 별도의 설정과정은 필요하지 않고 키 슬롯에 맞추어 서버 주소(IP)와 계정을 넣어 주면 서버로 접속할 수 있으며, 심플하면서도 강력한 SFTP프로그램을 이용할 수 있다 .(터미널 프로그램도 있지만 솔직히 별로다.)그리고 별도의 설정을 해주면 SFTP to FTP브릿지 모드로도 사용이 가능한 강력한 프로그램이다. (사실 이 기능이 주된 기능 중 하나이다.)

 

각 터미널별의 별도 설정은 아주 쉬우니, 직접 해보도록 하자.

 

 

 

SSH 공개 키를 이용한 접속하기

 

SSH는 기본적으로 아이디와 패스워드를 입력하여 접속을 한다. 그렇지만 여러가지 이유로 키를 이용해야 할 때가 있다. 대표적인 예로는 cron을 이용하여 rsync로 백업을 할 때ssh로 터널링을 하는 경우가 많다. 이때 공개키를 사용하지 않는다면 일일이 아이디와 패스워드를 입력해야 한다면 자동백업 자체가 불가능하게 된다.

 

SSH 서버 환경설정(sshd_config 설정)

공개 키를 이용하여 접속하기 위해서 먼저 SSH 서버에서 공개 키 인증에 관련된 옵션을 설정해야 한다. /etc/ssh/sshd_config 파일에서 “PubkeyAuthentication yes” 옵션이 활성화되어 있어야 원격지 시스템의 패스워드를 입력하지 않고 ssh에서 생성한 개인 키의 프레이즈를 사용할 수 있다.

그렇지만 처음에서는 시스템에 공개 키가 존재하지 않기 때문에 접속이 되지 않는다. 접속이 되 

지 않기 때문에 필요한 파일을 업로드 시킬 수 없게 된다. 그러므로 먼저 “PasswordAuthentication yes” 또는 “UsePAM yes”로 설정하여 키를 생성 후 ssh 서버로 공개 키를 복사하여야 한다. ssh 서버에 로그인할 때 공개 키 방식, PAM, 패스워드 방식순으로 설정되어 있어 공개 키 방식에 의한 인증이 실패하면 PAM, 패스워드 방식으로 인증을 처리하게 된다. 공개 키만으로 운영을 한다면 서버 관리자가 사용자루부터 공개 키를 메일이나 또는 파일로 전송받아 직접 등록해 주어야 하기 때문에 관리상 매운 힘들기 때문에 두 개를 동시에 지원하다.

 

[root@soo0e ~]# vi /etc/ssh/sshd_config

PubkeyAuthentication yes

AuthorizedKeysFile      .ssh/authorized_keys

PasswordAuthentication yes

ChallengeResponseAuthentication yes

UsePam yes

 

 

로컬 시스템에서의 접소을 위한 키 생성 

SSH 통신에 사용할 한 쌍의 키를 생성해야 하는데 –t 옵션을 이용하여 ssh2 프로토콜을 위한 dsa 또는 rsa 개인키 및 공개 키를 생성한다. 만약 프로토콜 1 dsa 비밀키 및 공개키를 생성하기 위해서는 “-t dsa1”과 같이 생성할 수 있으나 프로토콜 1은 하위 호환성이 필요할 때 생성하도록 하며 프로토콜 2를 사용할 것을 권고한다. “ssh-keygen –t dsa”와 같이 실행을 하였을 때 생성한 한 쌍의 키를 저장할 디렉토리를 지정해야 하는데 그냥 엔터를 입력하면 사용자 홈 디렉토리의 하위 디렉토리 즉 $HOME/.ssh 디렉토리에 id_dsa, id_dsa.pub 파일을 생성한다. 개인키(id_dsa) 및 공개 키(id_dsa.pub)에서 사용할 암호를 입력하여 두 번의 확인 절차를 거치면 키가 생성된다. 테스트를 위해서 가상 터미널에 root 사용자로 로그인을 하여 키를 생성한다.

[root@soo0e ~]# ssh-keygen -t dsa

Generating public/private dsa key pair.

Enter file in which to save the key (/root/.ssh/id_dsa):

Created directory '/root/.ssh'.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_dsa.

Your public key has been saved in /root/.ssh/id_dsa.pub.

The key fingerprint is:

50:39:16:d4:7a:99:5e:4e:82:09:88:86:9d:fd:d0:c5 root@soo0e

 

파일을 생성한 후 정상적으로 파일이 생성되었는지 확인한다.

[root@soo0e .ssh]# pwd

/root/.ssh

[root@soo0e .ssh]# ls

id_dsa  id_dsa.pub

 

공기 키를 서버의 홈 디렉토리로 복사 

공개 키를 scp sftp 또는 ftp를 이용하여 원격지 서버로 id_dsa.pub 파일을 authorized_key로 변경하여 복사한다.

[root@soo0e .ssh]# mv id_dsa.pub authorized_keys

[root@soo0e .ssh]# ls

authorized_key  id_dsa

 

~./ssh 퍼미션 설정 

 

클라이언트 시스템 

   

퍼미션 

~/.ssh 디렉토리 

700

~/ssh/id_dsa 개인키 파일 

600

 

원격지 서버 시스템 

   

퍼미션 

~/.ssh 디렉토리 

700

~/.ssh/authorized_keys

644 (or 600)

 

공개키를 이용한 접속 

 

[root@soo0e ~]# ssh root@192.168.2.11

Last login: Sun Sep 16 22:17:50 2007 from 192.168.2.12

[root@soo0e ~]#

 

필자는 공개키를 생성할 때 프레이즈 값을 입력하지 않아서 프레이즈 값을 물어보지 않고 바로 접속이 되었다. 만일 프레이즈 값을 입력하였다면 프레이즈 값을 입력해야 접속을 할 수 있다.

 

클라이언트에 있는 개인키를 다른 클라이언트에 복사하여 사용 할 수도 있다. , 키를 하나 생성하면 키를 복사하여 여러 개의 클라이언트에서 함께 사용이 가능하다는 것이다.

 

현관에 자물쇠(서버의 공유키)가 하나 있다면 가족 여럿이 열쇠(클라이언트의 개인키)를 복사하여 공동으로 사용하는것과 같은 이치라고 할 수 있다.


Trackback 0 Comment 0
2008.10.27 09:22

MySQL에서 Query Cache 사용하기

Query Cache


 MySQL 서버에서 Query Cache를 사용하고 있으며, SELECT 문을 수행한 결과의 텍스트 내용이 query cache에 저장하게 된다. (mysqld --query_cache_size=#을 지정하여 데몬을 시작한 경우)

앞서 진행했던 것과 동일한 query를 나중에 다시 받게 되면, 서버는 전에 query cache에 저장한 내용에서 클라이언트에 보낸다.

query cache는 테이블 내용이 자주 바뀌지 않거나, 동일한 쿼리를 반복하는 경우에는 아주 유용하다.

Query Cache에서 다음 두 문장은 다르게 처리된다.

        mysql> SELECT * FROM tbl_name;
        mysql> select * from tbl_name;

query cache에서 결과를 받아오려면 두 쿼리가 바이트 단위로 동일해야 하기 때문에 위 두 문장은 다르게 해석된다.

또한 Query가 서로 다른 데이터베이스를 사용한 경우, 서로 다른 프로토콜 버전을 사용한 경우, 서로 다른 디폴트 문자세트를 사용한 경우는 동일하지 않은 쿼리로 처리하여 query cache에서 결과를 받아 오지 않게 된다.

SELECT SQL_CALC_FOUND_ROWSSELECT FOUND_ROWS()와 같은 쿼리에도 이미 query cache에 직전의 정보가 담겨 있기 때문에 query cache로부터 결과를 가져온다.

쿼리 결과를 query cache에서 받아 오는 경우에는 show status 변수인 Com_select는 증가하지 않지만, Qcache_hits는 증가한다.

        mysql> show status like 'Com_select';
        mysql> show status like 'Qcache_hits';

INSERT, UPDATE, DELETE, TRUNCATE, ALTER, DROP TABLE, DROP DATABASE 문에 의해서 테이블이 변경되면, 이들 테이블로부터 사용했던 모든 캐시화된 쿼리는 무용지물이 되므로 query cache의 cache에서 제거된다.
(MRG_MyISAM 형 테이블도 포함됨)

트랜젝션 테이블인 InnoDB형 테이블이 COMMIT에 의해서 변경된 경우도
query cache의 내용은 무용지물이 된다.

다음에 나열된 함수가 포함된 경우도 query cache에 저장되지 않는다.

User-Defined Functions  GET_LOCK        MASTER_POS_WAIT
CURRENT_TIMESTAMP       CURDATE         ENCRYPT
UNIX_TIMESTAMP          CONNECTION_ID   RELEASE_LOCK
NOW                     CURTIME         CURRENT_TIME
LAST_INSERT_ID          USER            FOUND_ROWS
LOAD_FILE               SYSDATE         CURRENT_DATE
DATABASE                RAND            BENCHMARK


또한 사용자 변수가 있는 경우도 query cache에 저장되지 않으며, mysql system 데이터베이스를 참조한 다음과 같은 문장도 query cache에 저장되지 안는다.
  SELECT ... IN SHARE MODE
  SELECT ... INTO OUTFILE ...
  SELECT ... INTO DUMPFILE ...
  SELECT * FROM AUTOINCREMENT_FIELD IS NULL


비록 FOUND_ROWS()를 실행하여 바른 값이 반환되더라도 이는 직전의 쿼리가 query cache에 저장된 값이 출력되는 것이다.

쿼리가 어떤 테이블도 사용하지 않은 경우, 임시 테이블을 사용한 경우, 사용자가 테이블의 컬럼에 권한이 없는 경우도 쿼리 결과가 query cache에 저장되지 않는다.

쿼리 결과를 query cache에서 가져오기 전에 MySQL은 해당 데이터베이스와 테이블에 대한 SELECT 권한을 먼저 체크한다.

query_cache_size의 크기가 '0'이라면, 이는 query cache가 허용되지 않은 경우이다.(디폴트 임)

mysql> show variables like 'query_cache_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| query_cache_size | 0     |
+------------------+-------+
1 row in set (0.00 sec)

mysql>

이처럼 query cache가 설정되지 않았다면, mysqld를 시작할 때 옵션으로 다음과 같이 지정한다.

  --query_cache_limit=# (디폴트: 1MB)
  --query_cache_min_res_unit=# (디폴트: 4KB)
  --query_cache_size=# (디폴트: 0)
  --query_cache_type=#


여기서  query_cache_type은 다음과 같이 수치로 지정한다.

Option 설 명
0 OFF로 query cache를 사용하지 않음
1 ON으로 SELECT SQL_NO_CACHE...에 의한 쿼리를 제외하고 query cache를 허용함
2 DEMAND로 SELECT SQL_CACHE...에 의해서만 사용함



QUERY CACHE을 지정하여 시스템 관리자가 데몬을 구동하면 된다.

【예제】query_cache_size를 지정한 구동 스크립트
# cat /etc/rc2.d/S99mysqld
/export/home/mysql/bin/mysqld_safe \
   --user=mysql --query_cache_size=8M --log-bin &

#
mysql> show variables like 'query_cache_size';
+------------------+---------+
| Variable_name    | Value   |
+------------------+---------+
| query_cache_size | 8388608 |
+------------------+---------+
1 row in set (0.00 sec)

mysql> select * from aa;

mysql> select * from aa;

mysql> show status like 'Com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 1     |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show status like 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits   | 1     |
+---------------+-------+
1 row in set (0.02 sec)

mysql>

다음 명령처럼 실행하면, query cache의 디폴트 값에서 내부적으로 변경할 수 있다.

  QUERY_CACHE_TYPE=OFF | ON | DEMAND
  QUERY_CACHE_TYPE=0   | 1  | 2


여기서 사용되는 옵션의 의미는 다음과 같다.

Option 설 명
0 또는 OFF query cache를 사용하지 않음
1 또는 ON SELECT SQL_NO_CACHE...에 의한 쿼리를 제외하고 query cache를 허용함
2 또는 DEMAND SELECT SQL_CACHE...에 의해서만 사용함



SELECT 문에서 사용되는 Query Cache 옵션은 다음과 같다.

SQL_CACHE QUERY_CACHE_TYPE이 DEMAND이면 query한 내용이 cache됨
QUERY_CACHE_TYPE이 ON이면 디폴트이고,
QUERY-CACHE_TYPE이 OFF이면 query한 내용이 cache 안됨
SQL_NO_CACHE query를 non-cachable로 하여 cache에 저장하지 않음



FLUSH QUERY CACHE 명령으로 query cache의 조각을 재정리하지만
  query cache에 존재하는 어느 query도 제거해 없애지 않는다.

또한 FLUSH TABLES도 query cache를 flush 시킨다.

RESET QUERY CACHE 명령은 query cache에 존재하는 모든 query 내용을 제거한다.

현재의 MySQL 버전에서 서버가 query cache의 지원여부는 have_query_cache 변수로
확인이 가능하다.

mysql> show variables like 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+
1 row in set (0.00 sec)

mysql>

그리고 SHOW STATUS로 query cache의 퍼포먼스를 알아 볼 수 있는 변수는 다음과 같다.

variable 의 미
Qcache_queries_in_cache cache에 등록된 query의 수
Qcache_inserts cache에 추가된 query의 수
Qcache_hits query cache에서 받아온 횟수
Qcache_lowmem_prunes low memory 때문에 cache에서 삭제된 query 수
Qcache_not_cached QUERY_CACHE_TYPE나 not cachable 때문에 query한 정보가 cache에 저장되지 않는 수
Qcache_free_memory query cache의 여유 메모리량
Qcache_free_blocks query cache의 여유 메모리 블록 수
Qcache_total_blocks query cache에 할당된 총 블록 수


 

Query Cache는  MySQL에서 4.0.1 부터 지원 함

간단히 쿼리 결과에 대해 캐슁을 하여 속도 향상을 시행함

*/etc/my.cnf 적용 예 *

vi /etc/my.cnf

# 쿼리 캐싱 제한 메모리
set variable = query_cache_limit=10M

# 쿼리 캐싱 메모리 사이즈
set variable = query_cache_size=30M

# Query Cache 사용 타입

# 0 : 사용 안함 
# 1 : 모든 쿼리에 대해 캐싱하고
#     select문에서 seelct sql_no_cache를 쓰면 사용 안함

# 2 : 쿼리 캐쉬 선택 함 
#     slq 사용 예 : select sql_cache count(*) from board;

set variable = query_cache_type=1 


Trackback 0 Comment 0
2008.10.27 09:21

[Javascript] setTimeout() / setInterval() 메소드

1. setTimeout() 메소드 - 일정시간후 코드실행

  > setTimeout(code, delay);

  code : 일정시간 후 실행시킬 자바스크립트 코드를 포함한 문자열(함수나 alert같은 코드들...)
  delay : 문자열 code 내에 있는 자바스크립트 코드가 실행되기까지 걸리는 시간 (1/1000초 단위)

 

2. setInterval() 메소드 - 일정시간후 코드 반복실행

  > setInterval(code, delay);

  setTimeout()과 같이 일정시간후에 코드가 실행되지만, 한번실행이 아닌 반복실행된다.

  code : 일정시간 후 실행시킬 자바스크립트 코드를 포함한 문자열(함수나 alert같은 코드들...)
  delay : 문자열 code 내에 있는 자바스크립트 코드가 실행되기까지 걸리는 시간 (1/1000초 단위)

 

3. clearInterval() 메소드 - clearInterval로 setInterval함수로 정해진 반복코드를 멈추게한다.

  > clearInterval("setInterval로 생성된 변수")

  code : 일정시간 후 실행시킬 자바스크립트 코드를 포함한 문자열(함수나 alert같은 코드들...)
  delay : 문자열 code 내에 있는 자바스크립트 코드가 실행되기까지 걸리는 시간 (1/1000초 단위)

ex) var intA = setInterval("clock()",50)  // 0.05초마다 clock()함수를 실행한다.
      clearInterval(intA) //setInterval()로 실행된 메소드를 취소한다.



Trackback 0 Comment 0