Michael O'Neill's team had only themselves to blame for missing a host of chances to increase their lead after Dean Shiels had put them in front in the fourteenth minute.
The home team should have had their opponents dead and buried in the first half and after the interval had several opportunities to extend their lead.
The hosts had nearly all of the meaningful chances, with three efforts disallowed by the officials and Chris Brunt hitting the post before Daniel Da Mota's shot squirmed home via Ryan McGivern's shoulder to score the equaliser they had threatening with four minutes left.
Having set his team out for containment in Moscow, O'Neill selected a more attack-minded XI in Belfast.
Northern Ireland started with real purpose, almost scoring in the first minute.
The chance came from a corner, won after good interplay between Lafferty and Shiels.
Brunt floated it to West Brom team-mate Gareth McAuley who, after winning the header, directed the ball straight at the goalkeeper.
A loose pass from McGivern gifted Aurelien Joachim space to shoot, only for Jonny Evans to make the block. Then Northern Ireland took the lead through Shiels.
Somewhat surprisingly Evans played the role of creator, surging upfield and exchanging neat passes with the Rangers man.
Evans' second pass cut open the defence and Shiels lifted his shot deftly over the oncoming Jonathan Joubert.
I'm extremely disappointed; it's a game we clearly should have won. We got caught with a very poor goal at the end. I don't think we deserved that on the night even though the second-half performance was way below the standard we'd expect.
NI manager Michael O’Neill
After 21 minutes Evans thought he had made it 2-0 himself from a neat corner routine but the goal was ruled out due to a push.
There was disappointing news in the 29th minute when McAuley received his second booking in as many matches to rule him out of next month's trip to Portugal.
The hosts had a second effort disallowed soon after, Lafferty stroking a fine effort into the top corner after good work from Chris Baird, only to be pulled up for offside.
In the five minutes before half-time, Northern Ireland had three presentable chances to add to their lead.
Shiels failed to make the most of Guy Blaise's slip, then Lafferty chipped high and wide after being teed up by Brunt, who himself might have shot.
The West Brom man then found Baird with a bullet corner, but the latter's header flashed inches wide of the far post.
Luxembourg sent on Maurice Deville to lead the line for the second half in place of Joachim and they looked a sturdier proposition as the second half got under way.
Winger Mario Mutsch attempted to stretch the home back four five minutes into the second period but Evans was on hand with a forceful sliding tackle.
A McGivern overlap set Northern Ireland back on the attack but although Shiels got his head to Steven Davis' cross, a red shirt blocked it on its way towards goal.
Unbelievably, the home side had a third effort struck off by the officials on the hour, Lafferty in an offside position when he sidefooted Ferguson's cross home.
Lafferty, given onside for once, saw a 20-yard shot brush the outside of the post via Joubert's gloves but otherwise the closing stages were an increasingly nervy affair as Luxembourg pressed forward.
Davis gave Brunt the chance to ease the pressure with seven minutes left but, after meeting the carefully-measured pass, he rolled his shot against the base of the post.
Then, just moments later, the sucker punch arrived.
With too many green shirts committed forward, Luxembourg surged up the pitch and a shot opened up for Da Mota.
His effort appeared to be heading wide until it took a huge deflection off McGivern's shoulder to leave Roy Carroll stranded.
The Luxembourg bench celebrated emphatically, leaving the home fans to boo their players off at the final whistle.
The score leaves O'Neill's team with just a solitary point from their opening two matches in Group F.