• certbot 자동갱신 Let’s Encrypt SSL 인증서 업데이트

    certbot 자동갱신 Let’s Encrypt SSL 인증서 업데이트

    지난번 certbot 자동갱신을 crontab -e 항목에 입력하였습니다.

    3개월이 지난 시점 몇몇 서버에서 자동갱신이 되지 않아 https 보안 오류가 발생하여 사이트에 접속되지 않았습니다.

    이를 해결하기 위해서 기존의 세팅된 서버에 아래 내용을 추가해야합니다.

    ※ crontab 항목은 각자 맞게끔 수정 해주시기 바랍니다.

    rm -rf /root/_TION/tionServerLetsencryptRenewal
    rm -rf /tionServerLetsencryptRenewal.sh
    
    rm -rf /etc/letsencrypt/renewal-hooks/deploy/httpd_start.sh 
    rm -rf /etc/letsencrypt/renewal-hooks/pre/httpd_stop.sh 
    rm -rf /etc/letsencrypt/renewal-hooks/post/httpd_start.sh 
    
    mkdir /root/_TION/tionServerLetsencryptRenewal
    cd /root/_TION/tionServerLetsencryptRenewal
    
    echo "systemctl stop httpd.service" > tionServerLetsencryptRenewal.sh
    echo "certbot renew --no-self-upgrade" >> tionServerLetsencryptRenewal.sh
    echo "systemctl start httpd.service" >> tionServerLetsencryptRenewal.sh
    
    chmod 701 /root/_TION/tionServerLetsencryptRenewal/tionServerLetsencryptRenewal.sh
    
    cp -ai /root/_TION/tionServerLetsencryptRenewal/tionServerLetsencryptRenewal.sh /tionServerLetsencryptRenewal.sh
    
    ll
    
    /tionServerLetsencryptRenewal.sh
    
    echo -e "00 00 * * * ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime\n12 12 */12 * * /tionServerLetsencryptRenewal.sh\n*/1 * * * * /tionServerMonitoring.sh\n12 5 * * * /tionServerBackup.sh\n0 23 * * * root journalctl --vacuum-size=1024" | crontab
    
    crontab -e
    
    

    위의 항목을 그대로 복사 붙여넣기 하면 (빨강색 제외 : crontab 항목은 각자 맞게끔 수정해야합니다.)

    지난번 포스팅에서 매일 1시 12시 12분마다 체크해서 https 보안서버 만료될 경우 자동 갱신되도록 했습니다.

    하지만 renewal 폴더에 등록한 스크립트로 인해서 80포트가 멈추지 않고 그대로 연결되버려 리뉴얼되지 않더군요.

    그래서 위의 빨강색 코드는 crontab 전체를 삭제하고 새로 제서버에 맞게끔 등록하는겁니다.

    제 서버는 전체를 다 삭제하고 일괄 동일하게 구성하면 되지만 여러분들의 서버에는 crontab -e 항목이 저와 다르기 때문에 빨강색 만큼은 따로 수정을 해야합니다.

    기존에 포스팅을 따라하신분들만 crontab -e 부분을 아래 항목대로 변경하세요.

    crontab -e
    12 1,12 * * * root certbot renew --no-self-upgrade
    
    이 항목을 아래처럼 수정합니다.
    12 12 */12 * * /tionServerLetsencryptRenewal.sh

    이제부터 매월 12일과 24일에 12시 12분 마다 리뉴얼을 시도합니다.

    이때 기존과 다른점은 아파치 서버를 강제로 종료한다는 점이 다릅니다.

    한달에 서버 2회 강제로 재실행 한다고 생각하면 됩니다.

    이때 재갱신되는 도메인이 존재한다면 재실행 시간이 조금 더 길어지겠죠.

    그럼 잘 활용하세요.

  • cmd 배치파일 프로그램 실행 후 자동 종료

    cmd 배치파일 프로그램 실행 후 자동 종료

    cmd 배치파일 이용해서 프로그램을 실행하면 프로그램이 종료될때까지 cmd 창이 그대로 떠 있습니다.

    이를 그대로 놓고 사용해도 되지만 프로그램 화면 위에 cmd 창이 떠 있어서 불편할때가 있죠.

    그때 cmd 명령어를 call 대신에 start 를 이용하여 해결 할 수 있습니다.

    start "" "실행파일명.exe"

    call 명령어로도 해결되지 않고 단순 start 명령어러도 해결이 되지 않습니다.

    start 뒤에 꼭 따옴표 2개 작성해주시고 그다음에 실행 파일명 적으면 됩니다.

    재부팅 후에 자동으로 프로그램이 실행되며 cmd 창은 프로그램 실행과 동시에 자동 종료됩니다.

    해결 완료!!

  • 윈도우 시작시 프로그램 자동실행 c# 제작 소스코드

    윈도우 시작시 프로그램 자동실행 c# 제작 소스코드

    윈도우 시작시 프로그램 자동실행 소스코드

    보통 체크박스를 이용하여 윈도우 시작시 프로그램이 자동으로 실행하게 할껀지 아닐지 여부를 선택합니다.

    이렇게 체크박스를 만들어서 체크를 할 경우 윈도우시작할때 바로 프로그램이 실행되도록 할 수 있습니다.

    윈도우 시작시 프로그램 자동실행 소스코드

    // init()
    
                try
                {
                    if (ReadValue("info", "checkBox_윈도우자동시작") != null)
                    {
                        string text = ReadValue("info", "checkBox_윈도우자동시작");
    
                        if (text == "true")
                        {
                            checkBox_윈도우자동시작.Checked = true;
    
                        }
                        else
                        {
                            checkBox_윈도우자동시작.Checked = false;
                        }
    
                    }
    
                }
                catch { }
    
    
    // checkbox click
    
            RegistryKey runRegKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
    
            private void checkBox_윈도우자동시작_CheckedChanged(object sender, EventArgs e)
            {
                string 프로그램명 = string.Format("{0}", System.IO.Path.GetFileName(Application.ExecutablePath));
                if (checkBox_윈도우자동시작.Checked)
                {
                    runRegKey.SetValue(프로그램명,string.Format("{0}{1}", System.AppDomain.CurrentDomain.BaseDirectory, System.IO.Path.GetFileName(Application.ExecutablePath)
    ));
                    WriteValue("info", "checkBox_윈도우자동시작", "true");
                }
                else
                {
                    runRegKey.DeleteValue(프로그램명, false);
                    WriteValue("info", "checkBox_윈도우자동시작", "false");
                }
            }

    사실 위의 소스코드에서 가장 중요한 부분은 바로 RegistryKey 항목입니다.

    RegistryKey runRegKey = Registry.CurrentUser.OpenSubKey(“SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run”, true);

    레지스트리키에다가 현재 프로그램을 등록하는것이죠.

    윈도우 7, 8, 10, 11 시작프로그램 항목에 넣어서 할수도 있지만 조금 다른 부분은 바로가기 형식의 파일 링크를 걸어두는게 아닌 레지스트리키에 프로그램 경로를 String(문자열) 형태로 입력하는 방식입니다.

    이제 언제든지 컴퓨터를 켤때마다 자동으로 프로그램이 실행됩니다.

  • ESXi 서버구축 (대량설치 100대)

    ESXi 서버구축 (대량설치 100대)

    100대의 ESXi 서버를 대량으로 구축 할 때 필히 알아야 하는 사항

    1. Shift + O -> autoPartitionOSDataSize=8192

    USB 꽂아서 부팅시 작업

    2. root 아이디 제거 및 접속 아이디 생성, 관리자 권한

    3. 시간 동기화 -> NTP 설정 편집 time.bora.net -> NTP 서버 실행

    4. DCUI (콘솔모드) -> Enable SSH -> serverChecker 등록 (크론잡)

    5. SSL 인증서 등록

    이때 TCP/IP 작업해야함.

    6. SSH 접속 차단 및 보안 유지 – 방화벽 강화

    매크로를 이용한 접속 허용 IP 자동화 기술 추가

    7. 기타 편의사항 변경

    자동로그아웃 해제

    관리 > 시스템 > 고급 설정 > 검색 [ UserVars.HostClientSessionTimeout ] 값을 0 으로 변경

    고급 설정 항목을 수정해도 되지만 그냥 쉽게 도움말 왼쪽 설정을 변경하여도 됩니다.

    ESXi 용량추가 (익스텐트 확장)

    SSD 가격이 점점 저렴해지므로 SSD 500GB 이상 추가 확장

    이렇게 100개의 ESXi 마다 Email 시리얼키 발급

    끝!

    목표

    2023년 진행형

    ESXi 서버 100대 – 아파트 10채

    웹서버 1,000개 구동 – 유동 IP 갯수 1,100개 ( ISP 회선 22회선)

    네임서버 4대 운영 (AWS EC2 아시아 2대, USA 1대, 유럽 1대)

    워드프레스 50,000개 실행

    일 트래픽 10,000,000회

    전세계 웹사이트 점령 – 워드프레스 블로그, 포럼 사이트, 교육 시스템, 기업 시스템구축

  • c# 외부 ip 가져오기 로컬 ipv4 아이피 함수 Function

    c# 외부 ip 가져오기 로컬 ipv4 아이피 함수 Function

    C 프로그래밍 언어와 C++, C# 등 로컬 영역에서 동작하는 프로그램으로는 자신의 외부 아이피를 확인 할 수 없습니다. 특히 공유기를 이용하고 있고 사설 아이피로 IP를 할당 받았다면 더더욱 알수 없죠.

    기껏 알수 있는 아이피는 192.168.0.1 수준의 사설 아이피뿐입니다.

    C# 외부 로컬 ipv4 아이피를 알기 위해서는 아래 함수를 이용하면 바로 확인 할 수 있습니다.

    인터넷이 꼭 연결되어져 있어야 합니다.

    public static IPAddress GetExternalIp()
    {
    	string ip = string.Empty;
    
    	try
    	{
    		string sourceURL = string.Empty;
    		sourceURL = string.Format("https://api.tion.kr");
    
    		WebClient client = new WebClient();
    		client.Encoding = Encoding.UTF8;
    
    		string data = client.DownloadString(string.Format("https://api.tion.kr"));
    
    
    		string pattern = "(<myip>)(?<ip>[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}?)(</myip>)";
    		MatchCollection matches = Regex.Matches(data, pattern);
    
    		foreach (Match match in matches)
    		{
    			if (match.Groups["ip"].Length > 0)
    			{
    				//IP 정상적으로 나오는지 확인하는부분
    				//MessageBox.Show(match.Groups["ip"].Value);
    				ip = match.Groups["ip"].Value;
    			}
    		}
    	}
    	catch (Exception)
    	{
    
    	}
    
    	IPAddress externalIp = IPAddress.Parse(ip); 
    
    	return externalIp;
    
    }

    위의 함수 소스코드는 https://api.tion.kr 사이트에서 제공하고있습니다.

    위의 사이트도 제가 직접 만든 사이트입니다.

    실제로 C#에서 아이피를 가져와야할 일이 많다보니 2013년부터 만들어서 앞으로 계속 사용하기 위해서 만든거라 개발하실때 만드시더라도 특별한 일 없는이상 위의 도메인을 유지할겁니다.

    2017년도에 기간연장 10년치 최고 결재라서 10년치 결재했는데 벌써 4년 남았네요.

    2년정도 남았을때 다시 10년 기간 연장 해놓겠습니다.

    직접 C# 프로그램으로 제작해보았습니다.

    아래는 제가 C#으로 직접 만든 프로그램 입니다.

    c# 외부 ip 가져오기 소스코드

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace ESXi_IP_Monitoring
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                label_ip.Text = String.Format("{0}", GetExternalIp());
            }
    
            public static IPAddress GetExternalIp()
            {
                string ip = string.Empty;
    
                try
                {
                    string sourceURL = string.Empty;
                    sourceURL = string.Format("https://api.tion.kr");
    
                    WebClient client = new WebClient();
                    client.Encoding = Encoding.UTF8;
    
                    string data = client.DownloadString(string.Format("https://api.tion.kr"));
    
    
                    string pattern = "(<myip>)(?<ip>[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}?)(</myip>)";
                    MatchCollection matches = Regex.Matches(data, pattern);
    
                    foreach (Match match in matches)
                    {
                        if (match.Groups["ip"].Length > 0)
                        {
                            //IP 정상적으로 나오는지 확인하는 부분
                            //MessageBox.Show(match.Groups["ip"].Value);
                            ip = match.Groups["ip"].Value;
                        }
                    }
                }
                catch (Exception)
                {
    
                }
    
                IPAddress externalIp = IPAddress.Parse(ip);
    
                return externalIp;
    
            }
        }
    }
    

    외부 IP를 잘 가져오는군요.

    저는 이렇게 외부 IP를 자동으로 가져와서 ESXi 방화벽에 자동추가하는 시스템을 만들고 있습니다.

    외부 어느지역에서도 ESXi 서버에 자유롭게 자동으로 접속하기 위한 시스템이죠.

    방화벽으로 특정 IP만 접속 할 수 있도록 만들고 위의 프로그램으로 1분동안 접속 가능하도록 만들고 있습니다.

    노트북을 끄는 순간 1분후에 자동으로 제가 사용하던 IP도 차단이 되는 시스템이죠.

    보안으로 인해서 작년 말부터 고생을 하고 있어 이부분을 확실히 하고 있습니다.

    보안이 필요하신 분들 계시면 말씀주세요.

  • 윈도우 wget 대체 방법 vmware esxi 파일 공유 소스코드

    윈도우 wget 대체 방법 vmware esxi 파일 공유 소스코드

    윈도우 10, 11에서 VMWARE 강제 재부팅 문제 발생

    vmware 사용할때에는 자체 file share 기능을 이용하여 host 폴더를 지정하여 guest vm에서 같은 폴더를 지정하여 사용하였습니다. 그런데 host pc에서 최근들어 강제로 업데이트 되면서 vmware workstation 버전 상관없이 강제 재부팅이 자주 일어나고 있습니다.

    이를 해결하기 위해서 xenserver, vmware esxi, 기타 등등 linux 기반에서 vm을 관리하는 방법이 윈도우 10 강제 재부팅을 막을 수 있는 유일한 방법이더군요.

    게중에는 윈도우10, 11 업데이트를 막으면 된다는 글들이 많지만 실제로 수도 없이 해보았고 업데이트 안될시 불이익 등등 다 따져보았을때 운영체제를 바꾸는것이 정답이더군요.

    결국 ESXi 서버를 도입하게 되었습니다.

    그런데 이때 문제가 발생하더군요.

    기존에 vmware workstation 에서는 위에서 이미 말씀드린바 공유폴더를 지정할수 있었습니다.

    ESXi 와 Xenserver 와 같은 시스템에서는 그러한 부분들이 잘 되어 있지 않아 (제가 모를수도 있고요) 직접 guest vm마다 공유폴더를 만들어서 사용하려합니다.

    이렇다보니 윈도우7, 윈도우10 guest vm에서 파일을 강제로 다운받아야 하는데 리눅스처럼 wget 기능이 없어 윈도우 wget 대체 프로그램을 찾다가 파워쉘이 유일한 방법이더군요.

    그래서 제가 직접 만들게 된겁니다.

    wget.exe 파일 다운로드

    아래 파워쉘 방법은 그냥 참고 하시고요.

    매번 배치파일 만들어서 매번 저 명령어를 외울수도 없고…

    powershell "(New-Object System.Net.WebClient).DownloadFile('https://vlog.tion.co.kr/app/wget.exe','C:\Windows\System32\wget.exe')"
    
    powershell "(New-Object System.Net.WebClient).DownloadFile('https://URI','Filename.zip')"

    윈도우 wget 대체 소스코드 공유

    C#으로 만들었으며 소스코드는 그대로 올려놓을테니 저처럼 직접 필요한분들은 C#으로만들어 쓰세요.

    wget.exe 파일 다운로드

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Threading.Tasks;
    using static System.Net.Mime.MediaTypeNames;
    
    namespace wget
    {
        internal class Program
        {
            static void help()
            {
                Console.WriteLine("wget version: 1.0");
                Console.WriteLine("wget: missing URL");
                Console.WriteLine("Usage: wget https://vlog.tion.co.kr/app/wget.exe");
                Console.WriteLine("");
                Console.WriteLine("Try `wget --help` for help");
                Console.WriteLine("");
                Console.WriteLine("made by 리눅스맨 2023-02-24 vlog.tion.co.kr");
            }
            static void Main(string[] args)
            {
    
                if (args.Length == 0)
                {
                    help();
                }
                else
                {
                    switch (args.Length)
                    {
                        case 1:
    
                            if (args[0].Contains("http"))
                            {
                                Uri uri = new Uri(args[0]);
    
                                string fileName = null;
                                string[] uriSegments = uri.Segments;
                                int indexSegment = 0;
                                foreach (string getFileName in uriSegments)
                                {
                                    if (++indexSegment == uriSegments.Length)
                                    {
                                        //Console.WriteLine(getFileName);
                                        fileName = WebUtility.UrlDecode(getFileName.Trim());
                                    }
    
                                }
    
                                string remoteUri = uri.OriginalString;
                                string myStringWebResource = remoteUri;
                                // Create a new WebClient instance.
                                WebClient myWebClient = new WebClient();
                                // Concatenate the domain with the Web resource filename.
                                Console.WriteLine("Downloading File \"{0}\" from \"{1}\" .......\n\n", fileName, myStringWebResource);
                                // Download the Web resource and save it into the current filesystem folder.
    
                                myWebClient.DownloadFile(myStringWebResource, fileName);
                                Console.WriteLine("Successfully Downloaded File \"{0}\" from \"{1}\"", fileName, myStringWebResource);
                                Console.WriteLine("\nDownloaded file saved");
    
                            }
                            else if (args[0].Equals("--help"))
                            {
                                
                            }
                            else
                            {
                                help();
                                
                            }
    
                            break;
                    }
                }
                
            }
        }
    }
    

    이제 필요한 파일을 웹서버 하나 만들어서 업로드 하고 필요할때마다 wget.exe 파일 이용해서 다운받으면됩니다.

  • 웹서버 다운 원인 분석 결국 해커가 서버를 해킹

    웹서버 다운 원인 분석 결국 해커가 서버를 해킹

    웹서버 다운 원인 분석중입니다.

    워드프레스 홈페이지가 다운 되었다고 메일이 날라와서 그 시간대 로그를 확인해보았습니다.

    2023년 2월 17일 (금일 아침) 7시 47분 ~ 8시 8분 대략 22분정도 다운이 되었습니다.

    위의 파일은 serverChecker.php 파일을 1분마다 다운로드 받는것인데 제가 만들어놓은 스크립트가 있습니다.

    serverChecker.php 접속해서 자동으로 로그를 기록합니다.

    그걸 사용하시면 언제 웹서버가 다운되었는 정확하게 알 수 있습니다.

    파일 크키가 0일때 서버가 다운된것이므로 파일 크기 0일때를 조사해보았습니다.

    ll -SSh /root/_TION/_logs_tionServerMonitor/ | grep ^-

    3일정도를 분단위로 로그를 저장하고 있는데 하루에 한번씩 20분정도 서버가 멈추는 것으로 파악되었습니다.

    그리고 의문의 한가지가 있는데요.

    같은 시각 다른 서버에서도 동일한 흔적이 있었습니다.

    같은서버가 아님에도 불구하고 같은 시간 동일하게 서버가 다운되었습니다.

    그래서 로그를 확인해보니… 해킹시도로 인한 서비스 다운이 된듯합니다.

    최근에 관리자 접속이 계속 잠기고 로그인 할 수 없었는데 해커 2명정도가 계속 서버에 붙어서 로그인 시도를 하고 있었네요. 안타깝습니다.

    지금 확인하고 있는 가운데에도 계속 저렇게 해킹시도를 하고 있으니…

    이벤트 로그에서 해킹시도가 명백해졌으므로 IP 차단으로 해결할 문제는 아닌듯하고

    서버 root 접속 시도하는 모든 아이피를 자동으로 차단하도록 해야될꺼같단 생각이 들었습니다.

    아마존 EC2 운영은 보안서버가 EC2 서버 앞단에 있어서 방화벽으로IP를 제어할수 있지만

    ESXi, Xenserver 같은 개인서버를 운영할 경우 방화벽 단계가 없다보니 애시당초 로그인 자체를 못하게 막아야합니다.

    로그인 아이디 단 1번이라도 틀리면 접속을 못하도록 막아버려야 할꺼같습니다.

    ESXi 서버를 운영할 경우에는 아래 항목을 찾아서 변경합니다.

    Security.AccountLockFailures
    사용자 계정을 잠그기 전 허용되는 최대 로그인 실패 횟수입니다. 0은 계정 잠금을 사용하지 않습니다.
    5
    
    Security.AccountUnlockTime
    허용되는 최대 로그인 시도 실패 횟수를 초과한 후 사용자의 계정을 잠그는 기간(초)입니다.
    900
    

    저는 숫자를 900 기본값에서 999999999초로 변경하였습니다.

    31년동안 접속못하도록 막는 수치입니다.

    해커 IP가 31년 차단 당했네요.

    우리 31년 후에 만나자!~

    안녕.

    동시에 방화벽 설정에 접속 허용 IP를 지정해버렸습니다.

    완벽하게 접속하지 못하는것을 확인하였습니다.

    혹시나 유동IP 바뀌면 안되므로 고정아이피 3개랑 유동아이피 3개를 넣었습니다.

    바뀌더라도 어느 하나는 접속 가능하겠죠 ㅎㅎ

    해결 완료!

  • letsencrypt renewal-hooks SSL 보안인증 자동갱신

    letsencrypt renewal-hooks SSL 보안인증 자동갱신

    Let’s Encrypt renewal Hooks

    크론잡을 이용하여 아래 명령어를 입력하면 Let’s Encrypt SSL 보안 인증이 자동으로 갱신됩니다.

    하지만 보통 80 포트를 사용하고 있기에 apache 서버 80포트를 사용하고 있다면 중지를 먼저 해야합니다.

    스크립트를 이용하여 미리 아파치를 종료하고 켜고 반복할수 있겠지만…

    만료일이 도달하지 않을 경우 필요 이상으로 httpd 를 재실행 할 수 있습니다.

    crontab -e
    12 1,12 * * * root certbot renew --no-self-upgrade

    이를 방지 하기 위해서 Let’s Encrypt 3개월 무료 갱신 후크를 이용한 apache 중지, 실행, 재실행을 할 수 있습니다.

    스크립트 안에는 딱히 명령어가 많지는 않고 https 를 start, stop 명령만 넣었습니다.

    후킹에는 총 3개의 폴더로 구성되어 있습니다.

    deploy 배포후에 동작하는 shell script (재시작을 보통 넣지만 저는 start 를 입력했습니다)

    systemctl start httpd.service

    post 인증명령어 동장 후 무조건 진행하는 shell script

    systemctl start httpd.service

    pre 인증 전 미리 동작하는 shell script

    systemctl stop httpd.service

    하나하나 직접 만들어도 되지만 Let’s Encrypt 폴더가 /etc/letsencrypt 로 시작한다면 아래 명령어로 일괄 다운받아 설치 할 수 있습니다. 제가 서버 추가할때마다 아래 명령어를 그대로 복사해서 붙여넣고 있습니다.

    # 만약 다른 스크립트가 있다면 아래 명령어를 절대 실행해선 안됩니다. 모두 삭제됩니다.
    
    cd /etc/letsencrypt
    rm -rf /etc/letsencrypt/renewal-hooks/
    wget https://vlog.tion.co.kr/app/renewal-hooks.tar
    tar xvf renewal-hooks.tar
    rm -rf renewal-hooks.tar
    
    ll
    
    cd /etc/letsencrypt/renewal-hooks/
    du -ha
    

    파일이 정상적으로 다운받고 압축이 잘 풀렸는지 확인까지 한눈에 파악되니 쉽게 자동 인증서 갱신이 될듯합니다.

  • [ 해결 ] VMWARE VM-Tools 설치 안될때 윈도우7 SP1 보안업데이트 SHA-2 보안알고리즘 패치하세요

    [ 해결 ] VMWARE VM-Tools 설치 안될때 윈도우7 SP1 보안업데이트 SHA-2 보안알고리즘 패치하세요

    윈도우7 SP1 에서 vmware vm-tools 설치가 안되는 경우 있습니다.

    이때에는 보안업데이트를 제대로 하지 않아서입니다.

    보안업데이트 SHA-2 보안알고리 패치를 해야합니다.

    파일은 32비트 64비트 모두 다운받아놓았습니다.

    다른 윈도우에서는 접속을 하더라도 다운로드 받을 수 없어 파일을 리눅스맨 블로그에 올려놓았습니다.

    https://catalog.update.microsoft.com/Search.aspx?q=KB4474419

    보안 설치 후 윈도우 다시 시작하기 하면 아래처럼 업데이트를 받습니다.

    다시 VMWARE Tools 를 설치하면 정상적으로 에러 없이 설치가 진행됩니다.

    매번 VMware Tools 를 설치하면 설치 도중에 빨간색 경고창이 뜨면서 에러만 발생하고 설치가 안되었습니다.

    처음에는 윈도우7 SP1 설치가 안되어서 안되더니 SP1 업데이트 이 후에도 설치가 안되어서 이것저것 알아보다가

    보안업데이트 SHA-2 보안알고리 문제를 파악하고 패치 이후 모든것들이 잘 되기 시작했습니다.

    만약 이 패치가 진행되지 않게된다면 아래 내용들을 사용할 수 없게됩니다.

    닷넷 프레임워크 4.7버전 이상의 버전

    VMWARE Tools 설치 불가능

    익스플로러 브라우저 11버전 이상 설치 불가능

    패치 잘하세요~

  • ESXi 관리자 root 접속 차단 해킹막는방법

    ESXi 관리자 root 접속 차단 해킹막는방법

    사용자 이름이나 암호가 잘못되어 로그인을 완료할 수 없습니다.

    예전에 이와 관련하여 글을 작성한적 있습니다.

    ESXi 접속 시도가 많아 아래처럼 나오면서 관리자가 접속 못하는 일이 벌어집니다.

    예전에 이부분의 글을 작성하면서 사설 IP가 답이라고 생각했었죠.

    그런데 사설IP를 달기위해서는 랜카드2개와 공유기가 필요합니다.

    외부에서 VMWARE에서 네트워크 연결을 바로 할 수 없다는 점에서 상당히 불편하더군요.

    이를 보안하기 위해 글을 다시 작성하고 있는중입니다.

    ESXi ROOT 접속 차단

    ESXi root 접속을 막아버리고 모든 로그인 접속 시도를 수용하는 방식을 택하였습니다.

    root로 지속적으로 접속 실패시 root계정을 Lock 시켜버립니다.

    그리고 위에서 보셨던 [ 사용자 이름이나 암호가 잘못되어 로그인을 완료할 수 없습니다. ] 이 멘트와 함께 로그인 자체가 막혀버리게 됩니다.

    당장 접속이 되도록 풀어야하니 VM 게스트 PC를 모두 종료하고 재부팅을 한번 하시던지…

    root 접속이 안될때 timeout 시간을 0으로 바꾸고 [ Restart Management Agents ] 눌러주세요.

    (※ DCUI 모드에서 F2번 눌러 [ Troubleshooting Options ] 항목)

    원천적으로 ROOT 계정의 권한을 없애버릴경우 가장 이상적인 방법같습니다.

    ESXi root 관리자 사용안함

    1. [ 관리 -> 보안 및 사용자 -> 사용자 ] 이동해주세요.

    사용자 root 하나가 나와있다면 정상입니다.

    이곳에 이제 사용자 추가를 할겁니다.

    2. 사용자를 추가합니다.

    설명항목은 필수가 아니며 어떠한 계정인지 알기 쉽도록 적는 설명란입니다.

    새로운 ESXi 아이디가 추가 되었다면 권한을 줘야합니다.

    지금은 아무런 권한이 없어서 할 수 있는게 없습니다.

    3. 관리자 권한을 부여합니다.

    [ 호스트 -> 작업 -> 사용 권한 ] 항목을 들어가서 [ 사용자 추가 ] 항목을 클릭합니다.

    방금 생성한 계정을 선택합니다.

    관리자 항목을 선택합니다.

    Root 모든 항목을 체크합니다. (관리자 선택하면 자동으로 모두 체크됩니다)

    사용자 추가 버튼을 눌러주세요.

    추가 된 아이디가 관리자 권한을 획득한것을 확인하였습니다.

    4. 로그아웃 하고 새로 만든 계정으로 로그인합니다.

    이 과정은 root 계정을 역할을 없애서 로그인 접속할 수 없게 만들기 위함입니다.

    로그인이 정상적으로 되었는것을 확인하였습니다.

    다시 [ 호스트 -> 작업 -> 사용 권한 관리 ] 항목을 들어갑니다.

    [ 관리자 ] 항목을 [ 권한 없음 ] 항목응로 변경 합니다.

    정상적으로 바뀌었습니다.

    이제 로그아웃하여 root 로그인을 시도해봅니다.

    이 작업을 수행할 수 있는 사용 권한이 거부되었습니다.

    라고 나왔다면 정상적으로 되었습니다.

  • 워드프레스 필수 스니펫

    워드프레스 필수 스니펫

    code-snipptes 플러그인에서 필수로 만들어야 하는 항목들이 있습니다.

    처음 워드프레스를 만들면 head 영역에 워드프레스 검색이 되도록 javascript 입력해야하는경우도 있고

    또 테마의 라이선스 항목을 스타일로 없애기 위해 jQuery 프레임워크를 호출하여 사용하기도 합니다.

    이러한 필수 스니펫 항목을 일괄 import 할 수 있도록 json 파일로 만들어놓았습니다.

    파일을 다운받아서 code-snippets 플러그인에 import 하여 필요한 항목을 enabled 시켜서 사용하면 됩니다.

    워드프레스 설치 할때 플러그인도 새로 까셔야 하죠?

    필수 플러그인 바로 빠르게 설치 할 수 있도록 명령어로 구성해놓았습니다..

    필터에 업로드 Mimes 타입을 json 파일도 등록하였습니다.

    json 파일을 인터넷 다 검색해보면 text 로 타입을 잡아놨던데…. 잘못된 정보라서 정정해서 사용되도록 해놓았습니다.

    따로 글 올려놓을테니 보시고 도움되시기 바랍니다.

    잘 사용하세요.

  • 워드프레스 필수 플러그인

    워드프레스 필수 플러그인

    다른 플러그인의 설치 유무는 크게 중요하지 않습니다.

    하지만 위의 8개의 플러그인은 상당히 중요합니다.

    필수 항목이면서 매번 워드프레스를 설치할때마다 반복해야 하는 작업이라서 자동화를 위해 글을 작성합니다.

    일단 위의 플러그인을 일괄 압축하여 리눅스맨 워드프레스 블로그에 올려놓았습니다.

    사용방법은 아래 명령어를 그대로 wp-content 폴더에서 실행하면 됩니다.

    이때 기존 플러그인 폴더가 삭제되므로 이미 사용중인 워드프레스에서는 절대 실행하면 안됩니다.

    다시 말씀드리지만 처음에 워드프레스를 설치 할 때 설치 해야할 필수 항목입니다.

    #시작은 wp-content 폴더에서 명령어를 입력해주세요
    
    cd wp-content
    rm -rf plugins
    wget https://vlog.tion.co.kr/app/plugins.tar
    tar xvf plugins.tar
    rm -rf plugins.tar
    chown apache.apache plugins/ -R
    
    ll
    
    

    플러그인 설치를 위해 대략 5분정도 시간이 걸립니다. 이 시간을 줄이기 위함입니다.

    플러그인은 웹검색엔진 SEO 최적화에 집중되어져 있습니다.

    Yoast SEO 환경설정은 아래 내용을 그대로 import 넣으시기 바랍니다.

    ; These are settings for the Yoast SEO plugin by Yoast.com
    
    [wpseo]
    tracking = 
    license_server_version = 
    ms_defaults_set = 
    ignore_search_engines_discouraged_notice = 
    indexing_first_time = 
    indexing_started = 
    indexing_reason = ""
    indexables_indexing_completed = 
    version = "17.3"
    previous_version = "14.5"
    disableadvanced_meta = 1
    enable_headless_rest_endpoints = 1
    ryte_indexability = 1
    baiduverify = ""
    googleverify = ""
    msverify = ""
    yandexverify = ""
    site_type = "blog"
    has_multiple_authors = ""
    environment_type = "production"
    content_analysis_active = 1
    keyword_analysis_active = 1
    enable_admin_bar_menu = 1
    enable_cornerstone_content = 1
    enable_xml_sitemap = 1
    enable_text_link_counter = 1
    show_onboarding_notice = 
    first_activated_on = "1535634814"
    myyoast-oauth = 
    semrush_integration_active = 
    semrush_country_code = "us"
    permalink_structure = ""
    home_url = ""
    dynamic_permalinks = 
    category_base_url = ""
    tag_base_url = ""
    enable_enhanced_slack_sharing = 
    zapier_integration_active = 
    zapier_api_key = ""
    enable_metabox_insights = 
    enable_link_suggestions = 
    algolia_integration_active = 
    
    [wpseo_titles]
    forcerewritetitle = 
    separator = "sc-dash"
    title-home-wpseo = "%%sitename%%"
    title-author-wpseo = "%%name%%, Author at %%sitename%%"
    title-archive-wpseo = "%%date%% %%page%% %%sep%% %%sitename%%"
    title-search-wpseo = "%%searchphrase%% %%page%% %%sep%% %%sitename%%"
    title-404-wpseo = "%%sitename%% %%tag_description%% %%tag%%"
    social-title-author-wpseo = "%%name%%"
    social-title-archive-wpseo = "%%date%%"
    social-description-author-wpseo = ""
    social-description-archive-wpseo = ""
    social-image-url-author-wpseo = ""
    social-image-url-archive-wpseo = ""
    social-image-id-author-wpseo = 0
    social-image-id-archive-wpseo = 0
    metadesc-home-wpseo = "%%sitedesc%%"
    metadesc-author-wpseo = "%%sitename%% %%tag_description%% %%tag%%"
    metadesc-archive-wpseo = "%%sitename%% %%tag_description%% %%tag%%"
    rssbefore = ""
    rssafter = ""
    noindex-author-wpseo = 
    noindex-author-noposts-wpseo = 
    noindex-archive-wpseo = 
    disable-author = 
    disable-date = 
    disable-post_format = 
    disable-attachment = 1
    breadcrumbs-404crumb = ""
    breadcrumbs-display-blog-page = 
    breadcrumbs-boldlast = 
    breadcrumbs-archiveprefix = ""
    breadcrumbs-enable = 
    breadcrumbs-home = ""
    breadcrumbs-prefix = ""
    breadcrumbs-searchprefix = ""
    breadcrumbs-sep = ""
    website_name = ""
    person_name = ""
    person_logo = ""
    person_logo_id = 0
    alternate_website_name = ""
    company_logo = ""
    company_logo_id = 0
    company_logo_meta = 
    person_logo_meta = 
    company_name = ""
    company_or_person = "company"
    company_or_person_user_id = 1
    stripcategorybase = 
    open_graph_frontpage_title = "%%sitename%%"
    open_graph_frontpage_desc = ""
    open_graph_frontpage_image = ""
    open_graph_frontpage_image_id = 0
    title-post = "%%title%%"
    metadesc-post = "%%title%% %%tag%%"
    noindex-post = 
    display-metabox-pt-post = 1
    post_types-post-maintax = 0
    schema-page-type-post = "WebPage"
    schema-article-type-post = "Article"
    social-title-post = "%%title%%"
    social-description-post = ""
    social-image-url-post = ""
    social-image-id-post = 0
    title-page = "%%title%%"
    metadesc-page = "%%title%% %%tag%%"
    noindex-page = 
    display-metabox-pt-page = 1
    post_types-page-maintax = 0
    schema-page-type-page = "WebPage"
    schema-article-type-page = "None"
    social-title-page = "%%title%%"
    social-description-page = ""
    social-image-url-page = ""
    social-image-id-page = 0
    title-attachment = "%%title%% %%page%% %%sep%% %%sitename%%"
    metadesc-attachment = ""
    noindex-attachment = 
    display-metabox-pt-attachment = 1
    post_types-attachment-maintax = 0
    schema-page-type-attachment = "WebPage"
    schema-article-type-attachment = "None"
    title-tax-category = "%%term_title%% %%sep%% %%sitename%%"
    metadesc-tax-category = "%%term_title%% %%tag%%"
    display-metabox-tax-category = 1
    noindex-tax-category = 
    social-title-tax-category = "%%term_title%% Archives"
    social-description-tax-category = ""
    social-image-url-tax-category = ""
    social-image-id-tax-category = 0
    title-tax-post_tag = "%%term_title%%"
    metadesc-tax-post_tag = "%%term_title%% %%tag%%"
    display-metabox-tax-post_tag = 1
    noindex-tax-post_tag = 
    social-title-tax-post_tag = "%%term_title%% Archives"
    social-description-tax-post_tag = ""
    social-image-url-tax-post_tag = ""
    social-image-id-tax-post_tag = 0
    title-tax-post_format = "%%term_title%% %%sep%% %%sitename%%"
    metadesc-tax-post_format = "%%term_title%% %%tag%% %%page%%"
    display-metabox-tax-post_format = 
    noindex-tax-post_format = 
    social-title-tax-post_format = "%%term_title%% Archives"
    social-description-tax-post_format = ""
    social-image-url-tax-post_format = ""
    social-image-id-tax-post_format = 0
    taxonomy-category-ptparent = 
    taxonomy-post_tag-ptparent = 
    taxonomy-post_format-ptparent = 
    
    [wpseo_social]
    facebook_site = ""
    instagram_url = ""
    linkedin_url = ""
    myspace_url = ""
    og_default_image = ""
    og_default_image_id = ""
    og_frontpage_title = ""
    og_frontpage_desc = ""
    og_frontpage_image = ""
    og_frontpage_image_id = ""
    opengraph = 1
    pinterest_url = ""
    pinterestverify = ""
    twitter = 1
    twitter_site = ""
    twitter_card_type = "summary_large_image"
    youtube_url = ""
    wikipedia_url = ""

    워드프레스 필수 스니펫을 정리했습니다.

    아래 글 보시고 바로 import 해서 적용해보세요.

    잘 사용하세요.