2014-07-11 4 views
0

저는 클라이언트 인증을 사용하고 RESTful 서비스를 위해 https를 사용할 작은 회사를위한 웹 서비스를 만들고 있습니다. 나는 아주 간단한 질문을하고 싶다. 나는 너무 넓지는 않지만, 나는 인터넷 보안에 아주 새롭고 순진하다. 내 데이터가 안전한지 확인하기 위해 어떤 예방 조치를 취해야합니까?로컬 MySQL 데이터베이스로 웹 서버 보안하기

내 서비스에 대해 설명하기 위해 사용자는 민감하지 않은 정보를 저장하고 소금에 절인 암호로 로그인 할 때 만든 수제 인증 토큰을 사용하여 데이터베이스에서 검색합니다. MySQL이 로컬이고 액세스 권한이 원격으로 부여되어있는 amazon 인스턴스를 사용하고 있으므로 집에서 직접 액세스 할 수 있습니다. 몇 가지 PHP 스크립트를 사용하여 데이터를 요청하고 추가하는 작업을 수행하고 주입 방지를 시도하고 있습니다. 내 MySQL 자격 증명을 PHP 스크립트와 별도의 파일에 저장합니다. 나는 안전하다고 생각되는 pem 파일로 내 서버에만 ssh 할 수있다.

가장 큰 두려움은 누군가 내 데이터를 모두 삭제할 것이라는 것입니다. 다른 예방 조치를 취해야합니까? 감사합니다

+0

공개 인터넷에서 사용할 수있는 mysql 데몬을 방화벽 옆에 두지 않아야합니다. 필요에 따라 ip를 허용하고 다른 모든 요청은 차단하십시오. – Rufinus

+1

mysql 권한으로'username @ %'권한을 부여합니다. 'username @ localhost'와'username @ yourIP' 만 허용하십시오. – Barmar

+0

[MySQL 데이터베이스를 보유하고있는 간단한 Linux 서버 보안 설정?] (http://stackoverflow.com/questions/41641319/securing-a-simple-linux-server-that-holds-a-mysql-database) –

답변

1

아마존 EC2를 사용하는 경우 보안 그룹을 사용하여 MySQL 서버를 잠그고 외부 액세스가 불가능하도록해야합니다.

응용 프로그램 서버에는 액세스 제어에 사용해야하는 내부 비 라우팅 10.x 유형의 IP가 있으며 VPN 액세스 또는 SSH 터널링이 실용적이지 않은 경우 홈 네트워크와 같은 외부 IP가 허용 목록에 포함되어야합니다. 그 둘은 보안하기가 훨씬 쉽습니다.

웹 루트의 어느 위치에도 자격 증명, 구성 파일 또는 키가 저장되어 있지 않은지 확인하십시오. 즉, 실수로 응용 프로그램 서버를 가능한 최악의 방법으로 잘못 구성하면 디렉토리 색인이 켜지고 모든 것이 중요하므로 중요한 문제는 걸러 낼 수 없습니다.

실수로 실수로 *.inc의 다운로드를 제외 할 수도 있습니다. 여기에있는 아이디어는 일이 끔찍하게 엉망이되기 전에 깨뜨려 야 할 몇 가지 안전 장치를 설정하는 것입니다. 실수로 인한 실수는 항상 잘못된 계획의 결과입니다.

무엇보다도

, 매우 경계 누군가가 서버에 무료 통치를 코드에서 실수를 통해 트럭을 운전하고있을 때 당신을 도울 것입니다 MySQL 서버에 방화벽 보안의 어떤 양으로 SQL injection bugs을 방지하는 proper SQL escaping에 대해 수 . SQL 인터페이스 코드를 작성하기 전에 작성한 SQL 인터페이스 코드를 철저히 감사하는 것이 좋습니다.

버전 제어 시스템을 사용하는 적절한 배포 절차를 갖고 있어야합니다. 침입자가있는 경우 알려진 버전의 코드로 롤백하는 것은 매우 쉽습니다. 1990 년대 스타일의 "FTP를 사용하는 서버에서 파일 던짐"배포 방법은 시간이 지남에 따라 위험하며 비즈니스가 잘못 될 경우 치명적입니다. 버전 컨트롤을 사용하거나 빌린 시간에 살고 있습니다.

+0

조언 해 주셔서 감사합니다. 당신이 내 웹 루트에 자격 증명을 저장하지 않는다고 말할 때, 대신 php에 그들을 포함 할 수 있도록 내가 저장해야합니까?주입의 경우, GET 또는 POST 변수 모두에 대해 intval() 또는 mysqli_real_escape_string()을 사용하고 있는데, 이것으로 충분합니까? 다시 한 번 감사합니다 – shane

+0

외부 자격 증명을 저장하십시오. 따라서 mysite/public이 있다면 mysite/includes를 사용하십시오. 또한,'intval'을 사용하지 마십시오. 이는 일반적인 목적의 해결책이 아닙니다. 매개 변수화 된 쿼리와 ['bind_param'] (http://php.net/manual/en/mysqli-stmt.bind-param.php)은 보안 문제없이 사용자 데이터를 쿼리에 추가하는 가장 좋은 방법입니다. – tadman

+0

1) 보안 그룹을 사용하여 나 이외의 모든 사람이 내 서버에 대한 액세스를 제한하고, 웹 루트 외부에서 데이터베이스 자격 증명을 저장하고, 3) 적절한 SQL 이스케이프를 사용하고, 4) 버전 제어 시스템을 사용하여 가장 나쁜. '사용자'@ '%'mysql 사용자 중 하나를 제거하는 것은 나쁜 생각이 아닙니다. – shane

관련 문제