구글와이드(336x280)_상단 2개


웹개발자, ‘보안의식 결여-관행적 개발’ 문제 웹관련, IT 뉴스

출처 카페 > 해킹&정보보안,사이버수사기법.. | 이쁠란다
원문 http://cafe.naver.com/systemnetwork/242
자료제공 : IT정보보안실무교육센터
- 운영자ㆍ관리자에게만 보안 떠넘기는 개발자 각성해야...
- 관행에 젖은 웹개발, 웹사이트 보안 취약성과 관계있다!
- 백신업체 관계자 “시간차이일 뿐 국내 웹사이트 다 뚫을 수 있다”


웹 해킹으로 인한 여러 가지 사회문제가 불거지고 있는 상황이다. 이를 방지하기 위한 다양한 대책들이 쏟아지고 있지만 해킹피해는 여전하다.

이런 상황인데도 불구하고 웹 개발자들은 보안에 신경을 쓰지 않아도 된다고 주장한다. 즉 웹 개발자들은 보안전문가가 아니며 전적으로 보안은 운영자와 관리자가 담당해야 할 영역이라고 생각하는 경향이 있다.

개발자들이 보안문제까지 신경을 써야하는 것은 부당하다는 개발자들의 주장은 두가지로 분석해 볼 수 있다. 첫째, ‘보안대책 방법은 알고 있지만 관리자나 운영자가 보안대책에 대해 말하지 않았기 때문에 궂이 보안대책을 세울 필요가 없다. 시키지도 않은 일을 괜히 할 필요없다’는 생각. 그렇지 않다면 또 하나는 ‘지금까지 보안대책을 세워본 적도 없고 보안대책에 어떤 것들이 있는지 솔직히 몰랐다’는 것을 우회적으로 표현한 것일 수도 있다.

한국정보보호진흥원(KISA) 해킹대응팀 관계자는 “현재 웹개발자들이 공부하는 국내 웹개발 참고서(도서)들은 대부분 보안대책에 대해서는 전혀 언급하지 않고 있다”며 “따라서 개발자들은 책에서 배운 대로 웹 개발을 충실하게 하고 있으며 자신들의 웹개발 방법이 최선이라고 생각하는 오류를 범하고 있다”고 지적했다.

또한 그는 “사이트의 운영자와 관리자 그리고 CEO의 보안의식이 가장 중요하지만 웹개발자들의 보안의식 부재와 보안에 대한 무지도 문제점으로 지적할 수 있다”고 밝혔다.

KISA 인터넷침해사고대응지원센터 관계자는 “웹개발자들이 사이트 가입프로그램 개발시 주민등록번호, 전화번호, 주소 등을 묻는 프로그램은 마치 약방의 감초처럼 써먹고 있다”며 “이러한 정보들이 얼마나 중요한 개인정보인줄도 모르고 지금까지 해왔던 관행에 따라 웹사이트 개발을 하고 있어 개인정보 유출의 주요 요인이라고 말 할 수 있다”고 지적했다. 또한 “관리자나 운영자의 책임이 더 크겠지만 보안에 있어 개발자들의 책임이 없다는 말은 어불성설”이라고 일축했다.

모 바이러스 백신 업체 관계자는 “국내 웹사이트는 취약점이 많아 시간만 좀더 걸린다 안걸린다의 차이가 날뿐 대부분 다 뚫을 수 있다. 해커의 능력 또한 해킹 시간을 얼마나 줄이고 들키지 않고 원하는 정보를 빼내 올 수 있느냐에 달린 것”이라고 말한다.

그동안 홈페이지 개발시 개발자들이 간과한 취약점에 대해 살펴보고 그에 대한 보안대책에는 어떤 것들이 있을까? 그리고 습관적, 관행적으로 해왔던 웹개발시 문제점을 지적하는 시간을 갖고자 한다. 이와 관련 <보안뉴스>는 연재를 통해 몇 가지 문제점과 대책을 제시하겠다.

관리자 페이지에 대한 접근통제
접근통제는 특정 사용자들에게만 웹 콘텐츠나 기능들에 접근할 수 있도록 허가해 주는 것으로 일반적으로 관리자 페이지에 대한 접근통제가 필요하다.

관리자 페이지는 웹 서비스의 사용자나 데이터, 콘텐츠를 손쉽게 관리하기 위한 목적으로 다양한 기능과 권한을 갖고 있고 이는 홈페이지의 운영에 매우 중요한 역할을 하고 있으므로 일반사용자는 인증을 통과하지 못하도록 할 뿐 아니라 일반사용자가 관리자 페이지를 볼 수 없도록 해야 한다. 그러나 일반적으로 추측하기 쉬운 URL(ex: /admin, /manager)을 사용하고 있어, ID/패스워드에 대한 크랙 또는 접근 허가 정책에 대해 요청하는 부분의 정보를 변경함으로써 접근이 가능한 경우가 많다. 웹 관리자의 권한이 노출될 경우 홈페이지의 변조뿐만 아니라 취약성 정도에 따라서 웹 서버의 권한까지도 노출될 위험성이 존재한다.

관리자 페이지에 대한 관리 허술
위협 사례를 살펴보면 대부분의 관리자 페이지는‘http://www.test.com/admin’ 등과 같이 쉽게 추측이 가능하다. 또 인증 과정이 존재하더라도 SQL Injection, JavaScript 변조 등의 취약점을 이용해 인증과정을 우회하여 웹 관리자 권한을 획득 할 수 있다.

이에 대한 보호 대책으로는 일반사용자의 접근이 불필요한 관리자 로그인 페이지 주소를 유추하기 어려운 이름으로 변경한다.

중요한 정보를 가진 웹 서버의 특정 페이지들은 관리자 또는 특정 사용자만 접근할 필요가 있다. 반드시 그래야 한다. 이러한 주요 페이지들은 웹 서버에서 적절한 설정을 통해 특정 사용자만 접근이 가능하도록 사용자 접근제한을 할 수 있다.

웹 서버 보호 대책
별도의 네트워크 범위로 IP 레벨의 접근 권한을 설정하고 웹 관리자 메뉴의 접근을 제한하며 웹 관리자의 인터페이스는 특히, SSL기술을 이용해 HTTP over SSL과 같은 Data Transaction 암호화를 반드시 적용해야 한다.

가능하다면, VPN과 같은 네트워크 차원의 별도 보안시스템의 설치도 고려할 필요가 있다.

또한, 관리자 계정으로는 외부 사이트에서 접근하는 것을 허용하지 않는 것이 바람직하다. 대부분의 홈페이지에서 관리자 계정에 많은 권한을 부여하고 있는 경우가 많고, 일반 사용자용 게시판과는 달리 관리자용 게시판의 경우에는 별도 관리가 안되고 있는 경우가 많아 관리자 계정 권한 획득 시 홈페이지 시스템의 권한획득으로 이루어지기 쉽기 때문이다.

따라서 관리자 페이지의 경우, 사내 IP에서만 접근이 가능하도록 설정하고, 만일 외부 관리자의 접근이 반드시 필요한 경우라면, 사이트 관리 권한을 외부로 열어주지 않고도 가능한 VPN 기술을 사용하면 외부 관리자가 회사 내부(혹은 사이트) 네트워크로 접근할 수 있으며, 관리자는 보호된 백엔드 연결을 통해 사이트에 접근할 수 있다.

한편 admin, manager 등과 같이 추측하기 쉬운 디렉토리 명이나 파일명을 사용하지 않는 것이 바람직하고 관리자 페이지의 경우, 관리자 호스트 IP만 접근 가능하도록 설정해야 한다.

http://www.abc.com/admin.html
http://www.abc.com/admin_main.html
http://www.abc.com/admin/index.html
http://www.abc.com/admin/login.html
http://www.abc.com/master.html
http://www.abc.com/master/index.html

IIS 웹 서버에서 보호 대책
아래의 방법으로 [관리자 페이지] 접근을 제한해보자.
①설정→제어판→관리도구→인터넷 서비스 관리자 선택
②해당 관리자 페이지 폴더에 오른쪽 클릭을 하고 등록정보→디렉토리 보안→IP 주소 및 도메인 이름 제한→편집 버튼을 클릭
③액세스 거부를 선택하고 추가 버튼을 클릭하여 관리자 호스트IP 또는 서브넷을 등록


Apache 웹 서버에서 보호 대책
Apache 웹 서버의 환경설정 파일인 httpd.conf 파일의 Directory 섹션의 AllowOverride 지시자에서 AuthConfig 또는 All 추가하여 .htaccess를 통하여 사용자계정, 사용자 패스워드를 등록한 사용자만 접근이 가능하도록 하고 관리자 디렉토리(admin)에 대해 특정 IP에 대해서만 접근이 가능하도록 하기 위해서 다음과 같이 설정한다.

<Directory/home/www/admin/>
AllowOverride AuthConfig (또는 All)
Order deny, allow
Deny from all
Allow from 10.10.100.7 10.10.2.1/24

</Directory>
# 먼저 접근을 제어하고자 하는 디렉토리에 대한 상위 디렉토리 정의에
# AllowOverride 부분이 'All', 'AuthConfig', 'FileInfo' 등으로 설정되어 있어야 한다.
<Directory "접근을 제어하고자 하는 디렉토리">
......
AllowOverride FileInfo AuthConfig Limit
......
</Directory>
......
AccessFileName .htaccess
<Files ~ "^\ht">
Order allow, deny
Deny from all
</Files>
<.htaccess>
AuthName "인증이 필요한 관리자 페이지 입니다."
AuthType Basic
AuthUserFile /home/www/admin/.htpasswd
AuthGroupFile /dev/null
require valid-user
Order deny, allow
Deny from all
Allow from 10.10.100.7 10.10.2.1/24

관리자 페이지와 같이 인증이 필요한 디렉토리에 .htaccess 파일을 만들고 admin 계정의 패스워드를 다음과 같이 설정한다. 위와 같이 설정 후~apache/bin/htpasswd를 이용하여 사용자정보 파일(.htpasswd)을 생성한다.

# ~apache/bin/htpasswd -c /home/www/admin/.htpasswd [사용자명]
New password: ***********
Re-type new password: ***********
Adding password for user [사용자명]
#

※ 주의사항
① Apache 서버의 경우 AllowOverride 지시자를 변경시 apache restart가 필요하다.
② 관리자 페이지의 디렉토리명을 변경시 웹 프로그램에서 관리자 디렉토리의 경로명을 지정하고 있는 경우 웹 프로그램 또한 수정해야 한다.
③ 관리자 페이지 웹 서버 인증 설정시 관리자 디렉토리에는 일반 사용자의 접근이 필요한 파일이 존재하지 않아야 한다.


개발 언어별 대책
웹 관리자 메뉴의 접근을 특정 네트워크 대역으로 제한하여, IP Address까지도 인증요소로 체크하도록 웹 관리자 사용자인터페이스를 개발하고, 관리자 인증 후 접속할 수 있는 페이지의 경우 해당 페이지 주소를 직접 입력해 들어가지 못하도록 관리자 페이지 각각에 대하여 관리자 인증을 위한 세션관리를 해야 한다.

또 하나 접근 통제 정책을 구현하고 있는 코드는 구조화, 모듈화가 되어 있어야 하고 접근제어가 필요한 모든 페이지에 통제수단(로그인 체크 및 권한 체크)을 구현해야 한다. 특히 하나의 프로세스가 여러 개의 페이지 또는 모듈로 이루어져 있을 때 권한 체크가 누락되는 경우를 방지하기 위해서 공통 모듈을 사용하는 것을 권장한다.

또, 인증 과정을 처리하는 부분에 Client Side Script(Javascript, VBScript 등)를 사용하면 사용자가 임의로 수정할 수 있으므로 Server Side Script (PHP, ASP, JSP 등)를 통해 인증 및 필터링 과정이 수행되어야 한다.

■ 취약한 프로그래밍 예
<HTML>
<HEAD><TITLE> 관리자 페이지 </TITLE>
<SCRIPT language="JavaScript“>
function getCookie(name)
var cname = name +"=";
var dc = document.cookie;
if(dc.length > 0)
begin = dc.indexOf(cname);
if(begin != -1)
begin += cname.length;
end = dc.indexOf(";", begin);
if(end == -1) end = dc.length;
retrun unescape(dc.substring(begin, end));
return null;
function getValue(element)
var value = getCookie(element.name);
if(value != null) element.value = value;
</SCRIPT>
</HEAD>
<BODY>
<SCRIPT language="JavaScript“>
var auth;
auth = getCookie("logged_in");
if(auth != 1) // 인증 성공 쿠키가 없을경우 Main Page로 이동
window.location = "http://victim.com/login.html";
</SCRIPT>
관리자 페이지 내용

■ 안전한 프로그래밍 예
  • ASP
    <%
    If myfunc_userauth(userid, userpw) <> 1 Then 'DB에서 사용자 인증을 처리
    Response.write "인증 실패"
    Else
    If Request.ServerVariables("REMOTE_ADDR") <> "10.10.1.1" Then' 관리자 IP 확인
    Response.write "관리자 IP가 아닙니다."
    Response.write "인증실패“
    LogSave(userid, user_ip, 0)'접속에 실패한 ID 및 IP 기록
    Else
    Session("logged_in") = 1'인증에 성공했을경우 logged_in 에 1의 값을 셋팅
    Session("userid") = userid
    Session("user_ip") = Request.ServerVariables("REMOTE_ADDR")
    LogSave($userid, $user_ip)'접속에 사용한 ID 및 IP 기록
    ... 중략 ...
    End If
    End If
    %>

  • PHP
    <?PHP
    @session_start(); //세션 데이터를 초기화
    if(!myfunc_userauth($userid, $userpw) || $_SERVER["REMOTE_ADDR'] != "10.10.1.1")
    //DB 에서 사용자 인증을 처리, 관리자 IP인지 확인
    print "인증 실패";
    LogSave(userid, user_ip, 0)'접속에 실패한 ID 및 IP 기록
    exit;//인증 실패시 종료
    //인증에 성공한 경우 처리 해야 되는 부분
    if (!session_is_registered("logged_in"))
    $logged_in = 1;//인증에 성공했을경우 logged_in 에 1의 값을 셋팅
    $user_ip = $_SERVER["REMOTE_ADDR"];
    session_register("logged_in");//인증 결과 저장
    session_register("userid");//사용자 ID를 저장
    session_register("user_ip");//사용자 IP를 저장
    LogSave($userid, $user_ip);// 접속한 사용자 ID 및 IP 기록
    ... 중략 ...

  • JSP
    <%@ page contentType="text/html;charset=euc-kr" %>
    <%@ page import="java.util.* " %>
    <%@ page import="java.sql.* " %>
    <%
    //HttpSession session = request.getSession(true);
    String user_ip = request.getRemoteAddr();
    // form 에서 사용자 id와 사용자 password를 아래 변수로 전달
    if(!myfunc_userauth(userid, userpw) || !user_ip.equals("10.10.1.1"))
    //DB 에서 사용자 인증을 처리, 관리자 IP인지 확인
    out.println "인증 실패";
    LogSave(userid, user_ip, 0)'접속에 실패한 ID 및 IP 기록
    else
    //인증에 성공한 경우 처리 해야 되는 부분
    session.putValue("logged_in","logok");
    session.putValue("userid",userid);
    session.putValue("user_ip", user_ip);
    LogSave(userid, user_ip);// 접속한 사용자 ID 및 IP기록
    ...

    길민권 기자 boannews@infothe.com

null



바보들의 영문법 카페(클릭!!)

오늘의 메모....

시사평론-정론직필 다음 카페
http://cafe.daum.net/sisa-1

바보들의 영문법 다음 카페
http://cafe.daum.net/babo-edu/

티스토리 내 블로그
http://earthly.tistory.com/

내 블로그에 있는 모든 글들과 자료에 대한 펌과 링크는 무제한 허용됩니다.
(단, 내 블로그에 덧글쓰기가 차단된 자들에게는 펌, 트랙백, 핑백 등이 일체 허용되지 않음.)

그리고 내 블로그 최근글 목록을 제목별로 보시려면....
바로 아래에 있는 이전글 목록의 최근달을 클릭하시면 됩니다.
그러면 제목을 보고 편하게 글을 골라 보실 수 있습니다.

그리고 내 블로그내 글을 검색하시려면 아래 검색버튼을 이용하시면 됩니다.


가가챗창

flag_Visitors

free counters