안녕하세요.

유지보수하고있는 업체의 회원의 디비를 해킹당하여 사이버경찰서에 신고 후 진흥원에서 조사까지 받게되면서의 과정에 대해서 나중에는 실수를 하지 않고, 정보를 공유하여 다들 안전한 관리를 하기위해 리눅스 서버의 최소 보안 관리에 설정을 알려드립니다.

 

1. 로그 기록

 :: 웹 로그, 디비 로그는 최소 6개월~1년치는 저장이 기본으로 되어있지만, 리눅스 서버 설치시에는 기본으로 한달로 셋팅 되어있을 겁니다. 해당 로그 기록은 6개월로 변경을하여 서버에 저장하여 해킹 시점 전후의 로그파일을 유지해야합니다.

 

/etc/logrotate.conf 

weekly >> monthly

rotate 4 >> rotate 6

 

tip. 6개월치를 롤링하겠다는 설정입니다. (웹서버 로그를 6개월치를 저장하기위함)

btmp, messages, secure, dmesg, utmp, wtmp등 여러가지 설정도 기간을 늘려야하겠지만 당장 중요한 웹서버 로그를 늘리시는것이 중요합니다.

 

 

2. 방화벽

 :: 기본적으로 iptables를 통하여 기본 방화벽을 구성하실텐데, 꼭 필요한 port만 오픈을 하셔야합니다.

 

/etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 10888 -j ACCEPT 

..

 

3. ssh port 변경

 :: 기본적으로 ssh port는 22번이지만 다른 port를 열어서 사용하셔야합니다.

 

/etc/sshd/etc/ssh/sshd_config

Port 22 >> Port 10888

 

4. https 사이트로 변경

 :: http사이트라면 https 인증서를 구매하셔서 https로만 통신하게 변경해야 합니다.

 

/etc/httpd/conf.d/ssl.conf

SSLCertificateFile ...

SSLCertificateKeyFile ... 

SSLCACertificateFile ...

 

5. sw/hw 침입탐지시스템 침입방지시스템 확인.

  :: 기본적인 호스팅 서버를 사용하고 있어서 앞단에 침입탐지시스템이나 방지시스템이 없는 상황이였습니다.

해당을 보완하기위하여 서버에 접근하였을때 관리자에게 문자를 주도록 스크립트를 하나짜서 sw적인 시스템을 추가하였습니다. 

 

php 스크립트로 간단하게 작업하였고 방법은 crontab에 1분마다 해당 스크립트를 실행하여 리눅스 명령어인 w를 호출하여 해당 서버에 접근한 사람이 있다면 문자를 보내고, 로그를 남기게 해놓았습니다.

해당 스크립트라 필요하시면 댓글로 남겨주세요.

 

6. 5번까지는 서버 관련된 설정이였다면 6번부터는 UI에 관련된부분입니다. 해당 부분은 간단하게 열거하겠습니다.

 6.1. 관리자 페이지 2차 인증(핸드폰)

 6.2. 관리자 페이지 접근 제어(아이피)

 6.3. 웹셀 업로드시 확장자 체크(이미지 업로드 'input type=file' )

 6.4. 비이상 행위 3회 이상 접근차단

 6.5. 관리자 접근 로그

 6.6. 파라미터 변조 방지(mysql escape)

 6.7. 에디터를 사용중이라면 xssclean 적용

 

 

끝으로 개인정보침해시 벌금이 나오는건 둘째치고, 어느정도 보완을 통해 선처가 가능한 부분이고, 그전에 적용을 하면 더 좋은 상황이될것입니다. 그리고 제일 중요한것은 해킹당했다고 의심이 된다면 모든 회원에게 메일이나 문자를 통해 알려야만합니다. 제일 중요한 부분이니 이부분을 놓치시면 안됩니다.

 * 개인정보는 암호화도 중요합니다.

 

보완할것은 많겠지만 기본적인 보완은 이정도로만 진행하셔도 크게 문제가 없을것이라고 판단되며 제가 겪은일이기때문에 알려드립니다...

 

모두 안전하게 개인정보 보호 하세요.

도움이 필요하면 댓글 남겨주세요.

'linux' 카테고리의 다른 글

tshark 명령어가 먹지 않을 때(wireshark .2.2.4)  (0) 2017.07.06

안녕하세요.

mysql은 주기적으로 실행하는 스케줄러 기능이 존재합니다.

저는 주기적으로 삭제하기위해서 해당 스케줄러를 등록하여 사용중에 있는데 해당 방법을 알려드립니다.

 

#스케줄러 등록 방법

CREATE EVENT IF NOT EXISTS TEST_DELETE
    ON SCHEDULE
       EVERY 1 minute  // day,hour,minute,secode등 지정할수있습니다.
    ON COMPLETION NOT PRESERVE
    ENABLE
    COMMENT "삭제"
    DO 
    delete from test where ...

 

해당 mysql에 등록하면 test 디비를 1분마다 지우게되는 스크립트입니다. 해당 do 밑에다가 조건을 주어 삭제를 하게되면 데몬 및 crontab을 안통해서도 삭제가 가능합니다.

 

 

#스케줄러가 동작안 할 경우

SELECT @@event_scheduler;  --> 확인하여 off 라면

//설정 on

SET GLOBAL event_scheduler = 'ON';

 

간단하게 스케줄러를 등록하여 삭제, 등록, 수정을 할 수 있습니다.

 

감사합니다.

안녕하세요.

mysql에서 메모리 DB를 이용해야할 경우가 생겨 테스트를 진행하는겸 설정방법을 알려드리려고합니다.

 

mysql 테이블의 type을 memory로 변경하면 간단하게 사용하실 수 있습니다.

단점은 메모리에 올리기때문에 mysql이 재시작한다거나, 꺼지게되면 날라가게됩니다. (휘발성)

 

기본적으로 테이블의 타입은 InnoDB나 myisam디비를 사용하실텐데요, memory로 타입을 변경하여 성능 체크를 해보았습니다.

 

무한루프를 통하여 insert를 진행하였는데요,

 

간단하게 php 스크립트를 짜서 테스트하였습니다. (insert_test.php)

<?

 while(true){

  $query_ = "insert into test(field1,field2)values(now(), rand(..");

  mysqli_query($query);

 }

?>

해당 스크립트를 통해 innodb와 insert 성능 차이를 해본 결과

 

1초에 memory Type 3~4천개 정도가 들어가며, innodb는 15~30개선으로 들어가는것을 확인하였습니다.

성능 차이는 확실하나, 해당 memory 테이블의 max row는 max_heap_table_size=1G에 20만정도 래코드를 등록가능하였습니다.

 

 

안녕하세요.

 

스마트에디터를 모바일에서 사용할 경우 지정한 높이를 벗어나게 되면 상단 도구와 하단이 사라지게 되는 문제가 발생하는 경우가 있습니다.

 

해당 문제의 해결 방법은

 

smarteditor2/js/smarteditor2.js에 옵션 변경을 통해 해결 할 수 있습니다.

1. nBodyHeight = this._getResizeHeight(); >> 주석처리

2. smarteditor2/smart_editor2_inputarea.html 에서 <body class="se2_inputarea" style="display:table 추가"... >

 

 

여기저기 문제였다는 게시글은 있지만 해결책이 없는것 같아 이렇게 내용을 올리게 되었습니다.

 

또 이미지 크기의 해당 모바일 크기보다 커지는 경우 px로 잡히는 문제가 있는데요. 

해당 해결은 smarteditor2/css/smart_editor2_in.css안에다가 .se2_inputarea img { max-width:100%; }  해당 옵션을 넣어주면 됩니다.

 

스마트에디터의 모바일 크기가 px로 잡히게되어 모바일 크기를 넘어갈 경우의 해결방법은

smarteditor2/js/smarteditor2.js에서 $init : function(sDefaultEditing...{}함수안에

 

this.elEditingAreaContainer.style.width = oWdith.nSize + oWidth.sUnit;  >> 주석 처리

 

if(oWidth.sUnit === "px"){

     elAppContainer.style.width = (oWidth.nSize + 2) + "px";  >> 주석처리 

}

 

해당 두개의 width를 자동으로 잡는 부분만 주석 처리하시면 모바일 기기의 크기에 맞게 에디터가 나오게됩니다.

 

저처럼 하나하나 옵션을 살펴가며 고생하시지 마시고, 제가 올린글을 보면서 빠른 개발하시기를..

궁금하신거는 댓글 남겨주세요.

안녕하세요.

 

이번에는 네이버 SNS 로그인 구현 방법을 알려드립니다.

카카오톡이나 네이버나 똑같이 login.php, callback.php가 필요합니다.

만약 제 블로그에있는 카카오톡 로그인으로 구현하였다면 네이버도 금방 되실거에요.

 

* 스크립트 이름을 명시하겠습니다.

1. http://test_lee.co.kr/login.php

2. http://test_lee.co.kr/callback.php 

 

 

1. 네이버 개발자 센터 등록 및 key 받기

  1.1. https://developers.naver.com/main/ 접속.

  1.2. 상단에 어플리케이션 > 어플리케이션 등록 클릭.

  1.3. 어플리케이션 이름과 사용 API를 네이로 클릭.

  1.4. 제공 정보 선택에 체크 (필요한 정보를 체크 하시면 됩니다.)

  1.5. 환경에는 PC웹을 선택.

  1.6. 서비스 URL http://test_lee.co.kr/

  1.7. 로그인 Callback URL  http://test_lee.co.kr/callback.php 추가

 

2. login.php

 


define('NAVER_CLIENT_ID', '내어플리케이션 > 어플리케이션 정보 > Client ID');
define('NAVER_CLIENT_SECRET', '내어플리케이션 > 어플리케이션 정보 > Client Secret');
define('NAVER_CALLBACK_URL', 'http://test_lee.co.kr/callback.php);

 

$naverUrl = "https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id=".NAVER_CLIENT_ID."&redirect_uri=".urlencode(NAVER_CALLBACK_URL);

 

<html>

<body>

   <a href="<?=$naverUrl ?>"> <img src="네이버 로그인 이미지" title="네이버 로그인" alt="" style="width:30px"/></a>

</body>

</html>


3. callback.php


define('NAVER_CLIENT_ID', '내어플리케이션 > 어플리케이션 정보 > Client ID'');
define('NAVER_CLIENT_SECRET', '내어플리케이션 > 어플리케이션 정보 > Client Secret'); 
define('NAVER_CALLBACK_URL', 'http://test_lee.co.kr/callback.php');

 

$naver_curl = "https://nid.naver.com/oauth2.0/token?grant_type=authorization_code&client_id=".NAVER_CLIENT_ID."&client_secret=".NAVER_CLIENT_SECRET."&redirect_uri=".urlencode(NAVER_CALLBACK_URL)."&code=".$_GET['code'];
// 토큰값 가져오기 
$is_post = false; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $naver_curl); 
curl_setopt($ch, CURLOPT_POST, $is_post); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$response = curl_exec ($ch); 
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
curl_close ($ch); 
if($status_code == 200){ 
$responseArr = json_decode($response, true); 
  // 토큰값으로 네이버 회원정보 가져오기 
  $headers = array( 'Content-Type: application/json', sprintf('Authorization: Bearer %s', $responseArr['access_token']) ); 
  $is_post = false; 
  $me_ch = curl_init(); 
  curl_setopt($me_ch, CURLOPT_URL, "https://openapi.naver.com/v1/nid/me"); 
  curl_setopt($me_ch, CURLOPT_POST, $is_post ); 
  curl_setopt($me_ch, CURLOPT_HTTPHEADER, $headers); 
  curl_setopt($me_ch, CURLOPT_RETURNTRANSFER, true); 
  $res = curl_exec ($me_ch); 
  curl_close ($me_ch); 
  $res_data = json_decode($res , true); 
   
  if ($res_data ['response']['id']) { 
  //해당 아이디값을 정상적으로 가져온다면 디비에 해당 아이디로 회원가입 여부 확인 하여 회원 가입을 하였으면 자동 로그인 구현.

 
   if(이미 가입된 회원이면){
      //자동 로그인
      exit;
    }

 }

 

## 개인정보를 더 받는다면 회원가입 페이지로 location하고 아니면 프로필 정보 가져온곳에서 회원가입을 시켜주면 됩니다.

 


감사합니다.

궁금하신거는 댓글 달아주세요^^.

안녕하세요.

 

sns 로그인 기능을 구현하는 경우가 많은데요.

간단하게 카카오톡 로그인 기능을 구현하는 방법을 포스팅 하겠습니다.

 

일단 login 페이지와 callback 페이지가 필요합니다.

"http://test_lee.co.kr 테스트로 넣어드린 도메인입니다. 참고하세요."

1. http://test_lee.co.kr/login.php

2. http://test_lee.co.kr/callback.php

 

로 스크립트 이름을 명시하겠습니다.

1. kakao 개발자 센터 등록 및 key 받기

  1.1. https://developers.kakao.com/apps  접속.

  1.2. 앱 만들기 클릭.

  1.3. 내 어플리케이션 > 카카오 로그인 > 사용자 관리 > ON

  1.4. 수집 목록 체크 (필요한 정보를 체크 하시면 됩니다.)

  1.5. 로그인 Redirect URI에  http://test_lee.co.kr/callback.php 추가

 

2. login.php

 


$restapikey = "내어플리케이션 > 설정 > 일반 > REST API 키 복사"; //rest api key 입력

$callbackUrl = "http://test_lee.co.kr/callback.php"; //call back URL 입력

$kakaoUrl = "https://kauth.kakao.com/oauth/authorizeclient_id=".$restAPIKey."&redirect_uri=".$callbacURI."&response_type=code";

 

<html>

<body>

   <a href="<?=$kakaoUrl?>"> <img src="카카오 로그인 이미지" title="카카오톡 로그인" alt="" style="width:30px"/></a>

</body>

</html>


3. callback.php

 


$returnCode = $_GET["code"]; 
$restAPIKey = "내어플리케이션 > 설정 > 일반 > REST API 키 복사"; 
$callbacURI = urlencode("http://test_lee.co.kr/callback.php"); // 본인의 Call Back URL을 입력해주세요
// API 요청 URL
$returnUrl = "https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id=".$restAPIKey."&redirect_uri=".$callbacURI."&code=".$returnCode;

$isPost = false;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $returnUrl);
curl_setopt($ch, CURLOPT_POST, $isPost);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$headers = array();
$loginResponse = curl_exec ($ch);
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close ($ch);

$accessToken= json_decode($loginResponse)->access_token; // access token 가져옴

 

//방식은 PHP에서 호출하는 curl_init()도 있고 밑에 방식으로도 가능하다는점 알려드리려고 두 개를 같이 썻습니다.
$curl = 'curl -v -X GET https://kapi.kakao.com/v2/user/me -H "Authorization: Bearer '.$accessToken.'"';
$info = shell_exec($curl);
$info_arr = json_decode($info, true);

//카카오 프로필 정보를 가져옵니다


if ($info_arr['id'] > 0) {   

//해당 아이디값을 정상적으로 가져온다면 디비에 해당 아이디로 회원가입 여부 확인 하여 회원 가입을 하였으면 자동 로그인 구현.

 
   if(이미 가입된 회원이면){
      //자동 로그인
      exit;
    }
$mb_nickname = $info_arr["properties"]['nickname']; 

 

## 개인정보를 더 받는다면 회원가입 페이지로 location하고 아니면 프로필 정보 가져온곳에서 회원가입을 시켜주면 됩니다.

 


감사합니다.

궁금하신거는 댓글 달아주세요^^.

자바스크립트에서 동적으로 변수를 선언할 때.

 

간단 예제,

eval("playButton_"+i+" = document.querySelector('#toggleplay_"+i+"')");

eval("muteButton_"+i+" = document.querySelector('#togglemute_"+i+"')");

eval("playButton_"+i).addEventListener('click', onTogglePlay(i));

eval("muteButton_"+i).addEventListener('click', onToggleMute(i));

 

eval("vrView_"+i).on('ready', onVRViewReady(i));

eval("vrView_"+i).on('play', function() {});

eval("vrView_"+i).on('pause', function() {});

 

동적 변수를 선언 가능.

안녕하세요.

 

요즘 이미지는 그냥 보여주지는 않고 이미지 오버시 확대나 이벤트를 발생시켜서 생동감있는 페이지를 연출하는데요.

제일 간단하게 이미지 마우스 오버시 확대되고 마우스가 벗어나면 다시 되돌아오는 효과를 알려드리려고 합니다.

 

일단 정말 간단합니다.

 

1. html

<html>

<body>

<h1>이미지 확대 테스트 </h1>

<img class="scale" src="이미지 경로"/>

</body>

</html>

 

2. css

.scale {
  transform: scale(1);
  -webkit-transform: scale(1);
  -moz-transform: scale(1);
  -ms-transform: scale(1);
  -o-transform: scale(1);
  transition: all 0.5s ease-in-out;  /* 서서히 확대 */
}
.scale:hover {
  transform: scale(1.1);
  -webkit-transform: scale(1.1);
  -moz-transform: scale(1.1);
  -ms-transform: scale(1.1);
  -o-transform: scale(1.1);
}

 

1번의 html에 이미지에 class를 추가 해주면 간단하게 서서히 확대 되었다가 축소되는 효과를 볼 수 있습니다.

 

감사합니다^^

'html' 카테고리의 다른 글

HTML 한글 깨짐 관련.  (0) 2017.07.05

안녕하세요.

 

그누보드/영카트에서 작업하시다보면 새로운 php를 만들어서 ajax로 제어 및 session을 공유가 필요한 경우가 생기는데요. 아주 쉽게 session 공유하는 방법을 알려드립니다.

 

##그누보드/영카트 웹디렉토리.

1. /웹디렉토리/test.php를 만든다.

2. php 상단에 추가

@session_save_path($_SERVER["DOCUMENT_ROOT"]."/data/session");
@session_start();

3. print_r($_SESSION); 

 

이렇게 session 을 가져와서 해당 script는 맴버 외에는 막는다던지, session id값으로 mysql query를 날리시면 됩니다.

 

감사합니다.

안녕하세요.


자바스크립트에서 팝업 레이어어 유투브 영상을 추가하는 경우가 있는데요,

팝업 레이어를 닫아도 당연히 레이어가 닫히기 때문에 유투브 영상은 계속 재생이 됩니다.

그 문제를 해결하는 방법을 알려드릴게요.


#ex

<button onClick="open()">레이어 열기</button>

<div id="popup_layer" onClick="close()">

<div id="popup">

<iframe src="유투브 영상"

</div>

</div>


<script>

var embed_lyaer;

function close()

{

#닫기를 눌렀을때 불리는 함수

embed_lyaer=$('#popup').html(); // popup id에 잇는 html을 embed_lyaer 글로벌 변수에 담아 놓음.

$('#popup).html(''); //popup id에 html 을 제거 

}

function open(){

#열기를 눌렀을때 불리는 함수

$('#popup).html(embed_lyaer); //닫기를 눌렀을때 저장한 글로벌 변수를 다시 popup id에 넣어줌.

}

</script>


해당 닫기버튼을 눌렀을때 정상적으로 유투브 영상이 종료되는걸 확인하였습니다.


감사합니다.


+ Recent posts